首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无包含时间的蚂蚁LinkageError

无包含时间的蚂蚁LinkageError
EN

Stack Overflow用户
提问于 2015-06-13 02:51:12
回答 2查看 709关注 0票数 1

如何防止AntClassLoader和URLClassLoader造成链接错误?

由于一个较旧的项目,junit和hamcrest.core被放入ANT_HOME中,我们的构建使用includeantruntime=true来运行单元测试。

我现在正在处理一个用ant构建的项目,在这里我不想依赖ANT_HOME中的任何jar文件。我在所有javac节中都忠实地使用了includeantruntime=false。

但是,现在我正在使用hamcrest进行测试,我得到了一个运行时链接错误。

代码语言:javascript
复制
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运行测试时。

我似乎有两种选择,两种我都不喜欢:

  1. 从hamcrest.core中删除junit和ANT_HOME。这破坏了另一个项目。
  2. 从项目中删除junit和hamcrest.core,并依赖于ANT_HOME中的设置。这就是我想要避免的。

我原以为包括时间在内会有帮助。

我的目标是允许junit和hamcrest.core留在ANT_HOME中,同时也将它们包括在项目中。也就是说,ANT_HOME的内容应该无关紧要。

这个问题有解决办法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-06-15 18:29:23

解决这一问题有两个步骤:

  1. <pathelement path="${java.class.path}" />添加到测试环境的类路径。
  2. fork="true"添加到junit元素的属性。您还可以为junit元素选择一个叉模式。例如,我使用了forkmode="once"

对于所有条件,includeantruntime都应该保持为false

允许junit显式地将junit类加载器与ant类加载器分离,以防止任何无意中的关联。java.class.path需要显式地允许ant查找执行所需的所有类。

使用这些设置,ant目录中的库不会被使用,也不会干扰JUnit测试。

票数 2
EN

Stack Overflow用户

发布于 2015-06-13 09:05:48

设置"includeantruntime=false“是一件好事。它迫使您的构建更独立,更少依赖本地机器的配置,我喜欢将这个问题称为“神奇构建服务器”(没有人真正知道它是如何工作的)

我使用阿帕奇常春藤来管理ANT类路径依赖项。下面给出了在本地"lib“目录中使用jars的示例:

常春藤的真正力量是当你把它和Maven存储库结合起来。您的源代码仍然是可移植的,但不必随其所有第三方jars一起发布。起初,它似乎令人望而生畏,但它是一种值得研究的方法。有一些事情是Maven说得对的:-)

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30814603

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档