2016-09-06 7 views
1

EclipseをJava EEのMars 2用に使用しています。まずJava 8とApache Tomcat 8.0.xを使用してサーブレット・アプリケーションを作成しました。 IDEとそれはうまく動作します。Apache Tomcat 8.0はKotlinで書かれたサーブレット・クラスをEclipse for Java EE、Mars 2

今、コードをKotlinに移植しようとしています。しかし、Apache Tomcatサーバーは、以下の情報のように、クラスLoginServletを見つけてロードできません。

私はヘルパークラスとちょうどLoginServletという名前のサーブレットクラスを移植しました。私は裸の骨の骨格を提示するために、この問題のコードの残りの部分をすべて削除しています。ここで

は私のセットがアップしている:

package bookyard.server; 

// import statements ommitted for brevity 

open class LoginServlet : HttpServlet() { 

    override fun doGet(request : HttpServletRequest, response : HttpServletResponse) { 
     val msg: String = "HTTP GET method not supported."; 

     try { 
      response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED, msg); 
     } catch (e: IOException) { 
      e.printStackTrace(); 
     } 
    } 

    override fun doPost(request : HttpServletRequest, response : HttpServletResponse) { 
     this.doPostInternal(request, response); 
    } 

    private fun doPostInternal(request: HttpServletRequest, response: HttpServletResponse) { 
     ... 
    } 
} 

私が最初に@WebServlet("/login")アノテーションでLoginServletクラスを注釈付きが、それは、サーバがうまく走ったが、私にパス/ログインのため、さらにはのための404を与えましたServletContextパスhttp://localhost:8080/BookyardServer/

だから、私はWEB-INF\web.xmlファイルへのサーブレット構成を移動し、それが次のようになります。

<?xml version="1.0" encoding="UTF-8"?> 
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0"> 
    <display-name>BookyardServer</display-name> 

    <servlet> 
    <servlet-name>LoginServlet</servlet-name> 
    <servlet-class>bookyard.server.LoginServlet</servlet-class> 
    </servlet> 

    <servlet-mapping> 
    <servlet-name>LoginServlet</servlet-name> 
    <url-pattern>/login</url-pattern> 
    </servlet-mapping> 

    <welcome-file-list> 
    <welcome-file>index.html</welcome-file> 
    <welcome-file>index.htm</welcome-file> 
    <welcome-file>index.jsp</welcome-file> 
    <welcome-file>default.html</welcome-file> 
    <welcome-file>default.htm</welcome-file> 
    <welcome-file>default.jsp</welcome-file> 
    </welcome-file-list> 

</web-app> 

マイプロジェクトビルドパスは私のコードが使用するすべてのライブラリへの参照を含んでいます。そのスナップショットがここに用意されています。私プロジェクト・ファセットターゲット・ランタイム

enter image description here

、私はのApache Tomcat 8.0ランタイムへの参照を持っています。

enter image description here

enter image description here

しかし、私デバッグとしてとき - >デバッグサーバに、ブラウザは次のエラーを報告します。

HTTP Status 500 - Error instantiating servlet class bookyard.server.LoginServlet

message Error instantiating servlet class bookyard.server.LoginServlet

description The server encountered an internal error that prevented it from fulfilling this request.

exception javax.servlet.ServletException: Error instantiating servlet class bookyard.server.LoginServlet org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099) org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Unknown Source)

root cause java.lang.ClassNotFoundException: bookyard.server.LoginServlet org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1332) org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1166) org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528) org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099) org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:670) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520) org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476) java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) java.lang.Thread.run(Unknown Source)

私は、これは何かのを持っているかなり確信しています%CLASSPATH%としてください。ただし、わかりません。私はApache Tomcat jarファイルをクラスパスに設定しました。私のコードが使用するすべてのものはクラスパスにもあります。

私のサーブレットクラスをロードすることができませんなぜ私はわかりません。助けてもらえますか?

+2

これとあなたの2つの他のクラスパス関連の問題は、非常に幅広い「テクニカルサポート」タイプの質問と思われます。何が良い質問か:http://stackoverflow.com/help/how-to-ask ... IDEがWebアプリケーションとどのように動作するのか、Webアプリケーションにクラスファイルをどのように配備するのかを理解していれば、プロジェクトの一部が壊れています。エラーメッセージが表示されている間違った証拠をすべて表示するので、基礎を学ぶ時間がかかりませんでした。 Google、あなたの同僚に尋ね、あなたの宿題をし、質問をする前に基礎を学ぶ。これは厳しいように見えるかもしれませんが、インタラクティブなヘルプのための他のサイトがあります –

答えて

1

============================================== ==================== 2017年9月4日に

EDIT:

こんにちは友人:

私は回避策を見つけます。たぶんあなたを助けることができます。

(1)例えば、Kotlinメインクラスを作成します。

fun main(args: Array<String>) { 
    println("Hello, world!") 
} 

(2)右これはKotlinプラグインを行います。このメインクラスをクリックし、 "ファイル名を指定して実行" => "Kotlinアプリケーション" を選択すべてのKotlinソースファイルをコンパイルし、クラスファイルを生成します。

(3)アプリケーションサーバーにWebアプリケーションを配備し、代わりに元のフォルダのoutputedクラスフォルダを使用しています。例えば のアプリの「出力フォルダ」は「VAR /クラス」であれば、あなたはWTPの設定ファイル[.settings/org.eclipse.wst.commonで、アプリケーションサーバーには、このような それを展開することができます。コンポーネント]:また、あなたがEclipseの "Web配置アセンブリ" ダイアログからこれを設定することができます

<wb-resource deploy-path="/WEB-INF/classes" source-path="/var/classes"/> 

:今 ​​

、EclipseのWTPプラグインは、アプリケーションサーバに "VAR /クラス" フォルダを展開しますKotlinプラグインがまとめたすべてのクラスファイルが含まれ

============= ========================================== === 2016年11月17日に

EDIT:===========

https://youtrack.jetbrains.com/issue/KT-14838

こんにちは友人は、私はこの問題のために問題を作成しました==================================================あなたのkotlinクラスがTomcatサーバーにdelpoyedされていないよう=====

が見えます。

私は同じ問題を抱えているし、まだそれに取り組んで。

この記事をお読みください:

Can not publish Kotlin class files to Tomcat server

を私は最終的にWTP設定ファイル.settings/org.eclipse.wst.common.componentに設定し、次を追加することで 、この問題を解決し

<wb-resource deploy-path="/WEB-INF/classes" 
      source-path="/kotlin_bin"/> 

Kotlinクラスファイルは、仮想フォルダ/kotlin_binにコンパイルされ、このフォルダ内のクラスファイルはTomcat Serverにデプロイされます。

しかし、私はKotlin Eclipseプラグインは、開発者

のために、この問題の世話をする必要があります。しかし、新たな問題がが起こったと思います。

[/ kotlin_bin]フォルダ内のクラスファイルには、クラスとメソッドの宣言情報のみが含まれていますが、これらのクラスファイルでは実装コードは生成されません。

これらのクラスファイルもTomcatサーバーにデプロイされます。Tomcatサーバーを起動しようとすると、これらの不完全なクラスファイルによってjava.langが発生します。次のエラーメッセージを持つClassFormatError:私は私のプロジェクトからコンソールアプリケーションを実行する場合

Absent Code attribute in method that is not native or abstract in class file xxxx/xxxx/xxxx

は、kotlinプラグインは、ソースファイルをコンパイルし、クラスファイルを生成し、その後、私は手動でのTomcatサーバーにこれらのクラスファイルをコピーすることができます。 しかし、私は開発プロセスで何度も何度もやらなければならないので、これは非常に不便です。

+0

ありがとうございます。あなたがリンクしたURLからの解決策を含めるようにあなたの答えを編集しました。リンクが数年後に死んでしまい、他の誰かがこの問題を抱えているような場合に備えて、私は編集しました。 –

+0

実際、私はこの問題を解決しませんでした。 私は思ったが、別のエラーが起こった。 お読みください: https://discuss.kotlinlang.org/t/can-not-publish-kotlin-class-files-to-tomcat-server/1961/3 クラスファイルを[/ kotlin_bin]でクラスにはクラスとメソッドの宣言情報のみが含まれていますが、実装コードはこれらのクラスファイルで生成されません。 ので、これらの不完全なクラスファイルは、次のエラーメッセージを表示してます。java.lang.ClassFormatError発生します:クラス・ファイル内のネイティブまたは抽象ではない方法で 不在Code属性をXXXX/XXXX/XXXX –

+1

更新をありがとうございました。私は今あなたの答えを緑のcheckieを取っているので、この問題に直面している誰かがこれが彼らの問題を解決するとは思わない。個人的に、私はIntelliJ Ultimateに切り替えて、スムーズな経験をしました。しかし、私は同意します.Kotlin用のEclipseプラグインは、より良いサポートが必要です。 https://github.com/Sathyaish/Bookyard/#what-technologies-did-you-use-to-develop-this-application –

関連する問題