gpt4 book ai didi

java - 没有 includeantruntime 的 ant LinkageError

转载 作者:行者123 更新时间:2023-11-30 03:23:17 25 4
gpt4 key购买 nike

如何防止 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 运行测试时发生运行时链接错误。

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

  1. 从 ANT_HOME 中删除 junit 和 hamcrest.core。这打破了另一个项目。
  2. 从项目中删除junit和hamcrest.core依赖ANT_HOME 中的设置。这就是我试图避免的。

我本以为 includeantruntime 会有帮助。

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

这个问题有解决办法吗?

最佳答案

解决此问题有两个步骤:

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

includeantruntime应保留false适用于所有条件。

允许 junit 显式 fork ,将 junit 类加载器与 ant 类加载器分开,防止任何无意的关联。需要 java.class.path 来明确允许 ant 找到执行所需的所有类。

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

关于java - 没有 includeantruntime 的 ant LinkageError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30814603/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com