1

我误解的根源与我的类路径或类加载器有关,但我将在我使用 OpenEJB 的第一步的上下文中描述它。

我在玩嵌入式 OpenEJB,遇到了一些奇怪的问题。我正在使用 maven 来提取依赖项,其中一个是一个包含我所有 EJB 的 jar。

我的应用程序只是创建了一个 EJB 容器并尝试查找其中一个@Singleton包含在依赖项中的容器。

情况1)

当我main从依赖于 maven ( exec-maven-plugin) 的 Netbeans 启动时,一切正常,我可以查找我的 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。

这是我的 pom.xml 的一部分,用于创建 MANIFEST.MF 并将我的依赖项放在一个lib文件夹中。

<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