1

私の誤解の根源は、クラスパスまたはクラスローダーに関するものですが、OpenEJB の最初のステップのコンテキストで説明します。

私は OpenEJB を組み込んで遊んでいましたが、奇妙な問題に直面しました。私は maven を使用して依存関係を取得していますが、そのうちの 1 つはすべての EJB を含む jar です。

私のアプリケーションは単純に EJB コンテナーを作成@Singletonし、依存関係に含まれているいずれかをルックアップしようとします。

ケース1)

mainMaven () に依存する 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

誰かが私にこれを明確にすることができますか?

4

0 に答える 0