共享类加载器的Maven依赖项

时间:2016-08-17 16:36:55

标签: java maven classloader pom.xml maven-failsafe-plugin

我有3个不同的groupIds / ArtifactIDs的maven项目。项目A依赖于项目B和C.我正在使用maven-failsafe-plugin以便在构建期间从A运行B和C的集成测试:

(在项目A中):

<dependency>
        <groupId>com.group.b</groupId>
        <artifactId>artifactB</artifactId>
    </dependency>

    <dependency>
        <groupId>com.group.c</groupId>
        <artifactId>artifactC</artifactId>
</dependency>

但出于某种原因,当我在Project C中运行这一行时 -

URL path = ThisClass.class.getResource("/someResource");

它给了我项目B的jar位置,就像classloader在projectB

中一样

B和C都有一个名为/someResource的资源目录,这就是它失败的原因。当我执行相同的调用但是只存在于C中的资源时,那么类加载器是正确的:

(用C项目编写的代码)

    URL path1 = SomeClass.class.getResource("/directory1");
    System.out.println(pathA.getPath()); // .m2/../ProjectB.jar!/directory1

    URL path2 = SomeClass.class.getResource("/directory2");
    System.out.println(pathB.getPath()); // .m2/../ProjectC.jar!/directory2

由于directory1存在于B和C中,所以A给了我B的类加载器(第一个依赖),当它的目录只存在于C中时,然后我得到了正确的类加载器< / p>

如果我将依赖注释到B,那么一切都很好。

我还将<useSystemClassLoader>false</useSystemClassLoader>添加到maven-failsafe并且没有帮助

我也试过了<useManifestOnlyJar>false</useManifestOnlyJar>并没有改变任何东西

== UPDATE =======

如果有人建议如何在外部运行测试罐(jenkins,maven,无所谓)而不让他们的类加载器混淆

0 个答案:

没有答案