我误解的根源与我的类路径或类加载器有关,但我将在我使用 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
.
有人可以向我澄清这一点吗?