私の誤解の根源は、クラスパスまたはクラスローダーに関するものですが、OpenEJB の最初のステップのコンテキストで説明します。
私は OpenEJB を組み込んで遊んでいましたが、奇妙な問題に直面しました。私は maven を使用して依存関係を取得していますが、そのうちの 1 つはすべての EJB を含む jar です。
私のアプリケーションは単純に EJB コンテナーを作成@Singleton
し、依存関係に含まれているいずれかをルックアップしようとします。
ケース1)
main
Maven () に依存する Netbeans から起動すると、exec-maven-plugin
すべて正常に動作し、Bean を検索できます。このコマンドラインを使用します:
mvn -e "-Dexec.args=-classpath %classpath com.app.Main" -Dexec.executable=/usr/lib/jvm/java-7-openjdk/bin/java org.codehaus.mojo:exec-maven-plugin:1.2.1:exec
ケース 2)
アプリケーションを依存関係のある jar として特定のフォルダーにパッケージ化しようとするとlib
、EJB が見つかりません。
lib
これは、MANIFEST.MF を作成し、依存関係をフォルダーに配置するための pom.xml の一部です。
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<index>true</index>
<manifest>
<classpathPrefix>./lib/</classpathPrefix>
<addClasspath>true</addClasspath>
<mainClass>com.app.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
私はこの方法でアプリケーションを実行しています:
java -jar target/app.jar
ケース 1ではなぜEJB を見つけることができ、ケース 2では見つけられないのか疑問に思っています。
このコードを追加しました:
ClassLoader cl = ClassLoader.getSystemClassLoader();
URL[] urls = ((URLClassLoader)cl).getURLs();
for (URL url: urls){
System.out.println(url.getFile());
}
ケース1ではすべての依存関係が表示されますが、ケース2では現在のjarのみが表示されます
生成された jar から を開くと、MANIFEST.MF
すべての依存関係が に正しく追加されますClass-Path
。
誰かが私にこれを明確にすることができますか?