没有includeantruntime的ant LinkageError

时间:2015-06-13 02:51:13

标签: java ant junit

如何防止AntClassLoader和URLClassLoader导致链接错误?

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

我现在正在开发一个用ant构建的项目,我不想依赖ANT_HOME中的任何jar文件。我虔诚地在所有javac节中使用includeantruntime = false。

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

order-details.php

junit运行测试时发生运行时链接错误。

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

  1. 从ANT_HOME中删除junit和hamcrest.core。这打破了另一个 项目。
  2. 从项目中删除junit和hamcrest.core并依赖 ANT_HOME中的设置。这就是我想要避免的。
  3. 我原以为includeantruntime会有所帮助。

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

    这个问题有解决方法吗?

2 个答案:

答案 0 :(得分:2)

解决此问题有两个步骤:

  1. class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = 0); ~MainWindow(); void setSlowo(QString s) { slowo = s; } QString getSlovo() const { return slovo; } // same for wprowadzone private slots: ...... private: Ui::MainWindow *ui; Slowka s; QString slowo; QString wprowadzone; }; 添加到测试环境的类路径中。
  2. <pathelement path="${java.class.path}" />添加到junit元素的属性中。您还可以为junit元素选择fork模式。例如,我使用了fork="true"
  3. 所有条件

    forkmode="once"应保持includeantruntime

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

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

答案 1 :(得分:0)

设置&#34; includeantruntime = false&#34;是一件好事。它强制你的构建更独立,更少依赖于本地机器的配置,我喜欢称之为#34;魔术构建服务器&#34; (没有人真正知道它是如何工作的)

我使用Apache ivy来管理我的ANT类路径依赖项。以下给出了在本地&#34; lib&#34;中使用jar的示例。目录:

常春藤的真正力量是将它与Maven存储库结合使用。您的源代码仍然可移植,但不必与其所有第三方jar一起发货。起初它似乎令人生畏,但这是一种值得研究的方法。 Maven有些事情是正确的:-)

希望这有帮助。