了解类路径和类加载器

时间:2013-07-11 08:21:10

标签: java maven classpath classloader

我的误解的根源涉及到我的类路径或类加载器,但是我将在OpenEJB的第一步中描述它。

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

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

案例1)

当我从Netbeans启动main时,它依赖于maven(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)

如果我尝试将我的应用程序打包为具有特定文件夹lib中的依赖项的jar,则找不到我的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

有人可以向我澄清这个吗?

0 个答案:

没有答案