如何防止AntClassLoader和URLClassLoader造成链接错误?
由于一个较旧的项目,junit和hamcrest.core被放入ANT_HOME中,我们的构建使用includeantruntime=true来运行单元测试。
我现在正在处理一个用ant构建的项目,在这里我不想依赖ANT_HOME中的任何jar文件。我在所有javac节中都忠实地使用了includeantruntime=false。
但是,现在我正在使用hamcrest进行测试,我得到了一个运行时链接错误。
java.lang.LinkageError: loader constraint violation: when resolving method
"org.junit.Assert.assertThat(Ljava/lang/Object;Lorg/hamcrest/Matcher;)V"
the class loader (instance of org/apache/tools/ant/loader/AntClassLoader5)
of the current class, myclass, and the class loader (instance of
java/net/URLClassLoader) for resolved class, org/junit/Assert, have different
Class objects for the type assertThat used in the signature运行时链接错误发生在junit运行测试时。
我似乎有两种选择,两种我都不喜欢:
我原以为包括时间在内会有帮助。
我的目标是允许junit和hamcrest.core留在ANT_HOME中,同时也将它们包括在项目中。也就是说,ANT_HOME的内容应该无关紧要。
这个问题有解决办法吗?
发布于 2015-06-15 18:29:23
解决这一问题有两个步骤:
<pathelement path="${java.class.path}" />添加到测试环境的类路径。fork="true"添加到junit元素的属性。您还可以为junit元素选择一个叉模式。例如,我使用了forkmode="once"。对于所有条件,includeantruntime都应该保持为false。
允许junit显式地将junit类加载器与ant类加载器分离,以防止任何无意中的关联。java.class.path需要显式地允许ant查找执行所需的所有类。
使用这些设置,ant目录中的库不会被使用,也不会干扰JUnit测试。
发布于 2015-06-13 09:05:48
设置"includeantruntime=false“是一件好事。它迫使您的构建更独立,更少依赖本地机器的配置,我喜欢将这个问题称为“神奇构建服务器”(没有人真正知道它是如何工作的)
我使用阿帕奇常春藤来管理ANT类路径依赖项。下面给出了在本地"lib“目录中使用jars的示例:
常春藤的真正力量是当你把它和Maven存储库结合起来。您的源代码仍然是可移植的,但不必随其所有第三方jars一起发布。起初,它似乎令人望而生畏,但它是一种值得研究的方法。有一些事情是Maven说得对的:-)
希望这能有所帮助。
https://stackoverflow.com/questions/30814603
复制相似问题