2013-03-05 17 views
7

既存のJava/Tomcatアプリケーションを、tutorialに続いてHerokuでのデプロイメントに変更しようとしましたが、AppAssemblerでエントリクラスが見つからないという問題が発生しました。ターゲット/ bin/webapp(またはHerokuにデプロイする)を実行すると、Error: Could not find or load main class org.stopbadware.dsp.MainMaven AppAssemblerクラスが見つかりません

java -cp target/classes:target/dependency/* org.stopbadware.dsp.Mainが正常に実行されます。ここでのpom.xmlの関連部分があります:

<plugin> 
     <groupId>org.codehaus.mojo</groupId> 
     <artifactId>appassembler-maven-plugin</artifactId> 
     <version>1.1.1</version> 
     <configuration> 
      <assembleDirectory>target</assembleDirectory> 
      <programs> 
       <program> 
        <mainClass>org.stopbadware.dsp.Main</mainClass> 
        <name>webapp</name> 
       </program> 
      </programs> 
     </configuration> 
     <executions> 
      <execution> 
       <phase>package</phase> 
       <goals> 
        <goal>assemble</goal> 
       </goals> 
      </execution> 
     </executions> 
    </plugin> 

私の推測ではmvn packageあり、AppAssemblerが正しいクラスパスを使用しないように任意の提案を引き起こしていますか?

+0

生成されたスクリプト(.sh/.bat)の外観を表示できますか? – khmarbaise

+0

生成されたスクリプトはhttp://pastebin.com/f9gbVMgxで見ることができます - 見つからないMainクラスはPROJECTROOT/src/org/stopbadware/dsp/ – Exupery

答えて

5

あなたのアーティファクトのパッケージは、そうでない場合は、メインクラスが見つからない場合、jarに設定する必要があります。

<pom> 
    ... 
    <packaging>jar</packaging> 
    ... 
</pom> 

アーティファクト自体はクラスパスの最後に追加されるため、JARファイル以外は何も影響しません。生成されたスクリプトのクラスパスの先頭に付けてしまいます

export CLASSPATH_PREFIX=target/classes 

1

まず最初に、appassembler-maven-pluginの旧バージョンを使用していますが、現在のバージョンは1.3です。あなたは

<assembleDirectory>target</assembleDirectory> 

フォルダを定義している理由を私は理解していない何

。そのための良いデフォルト値が存在します。だからあなたはそれを必要としません。それ以外に、パッケージフェーズに限定された明示的な実行を定義する必要はありません。appassembler-maven-plugin is by default bound to the package phaseが発生します。

さらに、useWildcardClassPath設定オプションを使用すると、クラスパスを短くすることができます。

<configuration> 
    <useWildcardClassPath>true</useWildcardClassPath> 
    <repositoryLayout>flat</repositoryLayout> 
    ... 
    </configruation> 

そして、生成されたスクリプトの呼び出しでエラーがすべての依存関係がフォルダに配置されているリポジトリの場所が定義されて生成されたスクリプトでは異なっている事に依存している示しています。

+0

にあります。これはAppAssemblerで初めての経験であり、前に述べたチュートリアルの中にありました。 1を使用します。3、ディレクトリと実行参照を削除し、ワイルドカードオプションを追加しても、同じエラーが発生することはありませんでした。明らかに、スクリプトを作成するときには正しいクラスパスが作成されていません。悲しいことに、AppAssemblerのドキュメントは非常に限定されており、生成されたクラスパスに明示的に追加する方法は示されていません。 – Exupery

+0

ベストプラクティス(pom.xmlを持つ)を[jira](https://jira.codehaus.org/browse/MAPPASM)に置いて問題を作成するか、私にpom.xmlファイルを個人的に送信することです私はあなたの問題を調べることができます。 – khmarbaise

+0

pom.xmlはhttp://pastebin.com/11WmjBmBにあります。appassemblerで生成されたスクリプトはhttp://pastebin.com/f9gbVMgxにあり、クラスパスに見つからないPROJECTROOT/target/classesエントリが'' $ BASEDIR "/ classes'を追加して修正しました – Exupery

1

"$BASEDIR"/classesを生成されたスクリプトのCLASSPATH行に追加することでこれを解決できました。 mvn packageの各呼び出しでスクリプトが書き直されるので、私はmvn packageを呼び出し、必要なクラスパスエントリを追加する短いスクリプトを書いた。

明らかにちょっとしたハックですが、より適切な解決策を試して8時間以上経た後、これは今のところ行わなければなりません。ここで提案されているクラスパスを修正する、より洗練された方法を楽しむことは間違いありません。

3

試してみてください。

mvn clean package jar:jar appassembler:assemble 
+2

これは私のローカルマシンで正常に動作しますが、Herokuに一度はデプロイされません。私が見るところでは、Herokuのmavenコマンドをデフォルトの 'mvn clean install'から変更する方法はありません(' jar:jar appassembler:assemble'をMAVEN_OPTSに追加することは効果がありませんでした)。 – Exupery

1

私はこのチュートリアルを少し前に行っていて、非常に似た問題がありました。私は非常にうまく私のために働く少し異なるアプローチで来た。

それは前に述べたように、すべての最初に、あなたがjar<packaging>jar</packaging>)として、あなたのPOMの型を維持する必要が - それのおかげで、appassemblerプラグインは、あなたのクラスからJARファイルを生成し、クラスパスに追加します。だからこそ、あなたのエラーは消えます。

このチュートリアルのTomcatは、アプリケーションのソースディレクトリからインスタンス化されています。多くの場合、十分ですが、その方法を使用すると、ソース内の/WEB-INF/classesが空であり、Tomcatがサーブレットクラスをスキャンすることができないため、Servlet @WebServlet注釈を利用できなくなります。そのため、hereのようにTomcatの初期化(リソースコンフィグレーション)を追加しない限り、そのチュートリアルのHelloServletサーブレットは機能しません。

私は少し異なるアプローチをした:

私はアプリケーションの私のソースディレクトリとしてディレクトリを生成しpackage、使用中org.apache.maven.plugins:maven-war-pluginプラグイン(exploded目標)を実行します。このアプローチでは、私のWebアプリケーションディレクトリには、/WEB-INF/classesが "populated"というクラスを持っています。これにより、Tomcatはスキャンジョブを正しく実行できるようになります(つまり、Servlet @WebServlet注釈が機能します)。

は、私はまた、ランチャーのクラスで自分のアプリケーションのソースを変更する必要がありました:

public static void main(String[] args) throws Exception { 
    // Web application is generated in directory name as specified in build/finalName 
    // in maven pom.xml 
    String webappDirLocation = "target/embeddedTomcatSample/"; 
    Tomcat tomcat = new Tomcat(); 

    // ... remaining code does not change 

私は追加POMへの変更 - ちょうどappassemblerプラグインの前maven-war-pluginが含まれていました。

... 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.5</version> 
    <executions> 
     <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>exploded</goal> 
      </goals> 
     </execution> 
    </executions> 
</plugin> 
... 

ことに注意してくださいexplodedゴールが呼び出されます。

小さな変更があなたに役立つことを願っています。そのチュートリアルとMavenのビルドに


つ以上のコメント:チュートリアルは、アプリケーションを構築し、Herokuの中でそれを実行するのがいかに簡単で表示するように書かれていたことに注意してください。しかし、これはMavenビルドに最適なアプローチではありません。

POMごとに1つのアーティファクトを作成することを推奨することが推奨されています。あなたのケースであるべき2つのアーティファクト:

  • のTomcatランチャー
  • TomcatのWebアプリケーション

の両方として別々のPOMを構築し、自分の親POMからモジュールとして参照する必要があります。このチュートリアルの複雑さを見ると、2つのモジュールに分割するのはあまり意味がありません。しかし、あなたのアプリケーションがますます複雑になり(ランチャーがいくつかの追加の設定などを取得した場合)、それは "分割"することに多くの意味があります。実際には、すでに作成された "Tomcatランチャー"ライブラリがいくつかありますので、代わりにそれらを使用することもできます。

関連する問題