[英]How to add native library to “java.library.path” with Eclipse launch (instead of overriding it)
[英]How to add a native library path to the JUNIT task?
我有一个使用此驱动程序进行串行通信的 Java 项目。 驱动使用Windows下的dll来创建串口。
该项目包含几个 JUnit 测试,这些测试使用“运行方式 - > JUnit 测试”成功完成。 但是,在运行 ant 时,引用本机库的测试会失败(并且不引用本机库的测试通过)。
到目前为止,我最好的猜测是将包含本机库的目录添加到 java.library.path 中,但我没有通过 build.xml 文件成功地这样做。
有人能说出一个(干净的)解决方案吗?
这是我的 build.xml:
<path id="compile.classpath">
<fileset dir="${lib}">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${junit_home}">
<include name="**/*.jar"/>
</fileset>
</path>
<path id="test.classpath">
<pathelement location="${bin}" />
<fileset dir="${lib}">
<include name="**/*.jar"/>
</fileset>
<fileset dir="${junit_home}">
<include name="**/*.jar"/>
</fileset>
</path>
<target name="compile">
<mkdir dir="${bin}" />
<echo Message="Compiling src folder..." />
<javac includeantruntime="no" classpathref="compile.classpath" srcdir="${src}" destdir="${bin}" />
<echo Message="Compiling test folder..." />
<javac includeantruntime="no" classpathref="compile.classpath" srcdir="${test}" destdir="${bin}" />
</target>
<target name="test">
<mkdir dir="${test.reports}" />
<junit fork="yes" printsummary="yes" haltonfailure="yes">
<test name="${test.class.name}" todir="${test.reports}" />
<formatter type="xml" />
<classpath refid="test.classpath" />
</junit>
</target>
这是测试报告的一部分(XML 格式):
<testcase classname="nl.timo.comport.test.buildservertests.ComportFactoryTest" name="testGetInstance" time="0.0" />
<testcase classname="nl.timo.comport.test.buildservertests.ComportFactoryTest" name="testCreateDefaultComport" time="0.016">
<error message="giovynet.nativelink.SerialPort.getStateSerialPortC(Ljava/lang/String;)Ljava/lang/String;" type="java.lang.UnsatisfiedLinkError">java.lang.UnsatisfiedLinkError: giovynet.nativelink.SerialPort.getStateSerialPortC(Ljava/lang/String;)Ljava/lang/String;
at giovynet.nativelink.SerialPort.getStateSerialPortC(Native Method)
at giovynet.nativelink.SerialPort.getFreeSerialPort(SerialPort.java:50)
at package.comport.GioComport.getFreeSerialPorts(Unknown Source)
at package.comport.GioComport.findDevice(Unknown Source)
at package.comport.GioComport.<init>(Unknown Source)
at package.comport.ComportFactory.createNewPort(Unknown Source)
at package.comport.ComportFactory.createComport(Unknown Source)
at package.comport.test.buildservertests.ComportFactoryTest.testCreateDefaultComport(Unknown Source)
</error>
</testcase>
<testcase classname="nl.timo.comport.test.buildservertests.ComportFactoryTest" name="testCreateComportWithWrongSettings" time="0.0">
<error message="giovynet.nativelink.SerialPort.getStateSerialPortC(Ljava/lang/String;)Ljava/lang/String;" type="java.lang.UnsatisfiedLinkError">java.lang.UnsatisfiedLinkError: giovynet.nativelink.SerialPort.getStateSerialPortC(Ljava/lang/String;)Ljava/lang/String;
at giovynet.nativelink.SerialPort.getStateSerialPortC(Native Method)
at giovynet.nativelink.SerialPort.getFreeSerialPort(SerialPort.java:50)
at package.comport.GioComport.getFreeSerialPorts(Unknown Source)
at package.comport.GioComport.findDevice(Unknown Source)
at package.comport.GioComport.<init>(Unknown Source)
at package.comport.ComportFactory.createNewPort(Unknown Source)
at package.comport.ComportFactory.createComport(Unknown Source)
at package.comport.test.buildservertests.ComportFactoryTest.testCreateComportWithWrongSettings(Unknown Source)
</error>
</testcase>
<system-out><![CDATA[]]></system-out>
<system-err><![CDATA[java.lang.UnsatisfiedLinkError: no libSerialPort in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
Ant 中的junit 任务允许设置系统属性,就像其他一些任务一样。 您需要将sysproperty
嵌套元素中的java.library.path
值指定为:
<junit fork="yes" printsummary="yes" haltonfailure="yes">
<test name="${test.class.name}" todir="${test.reports}" />
<formatter type="xml" />
<classpath refid="test.classpath" />
<sysproperty key="java.library.path" value="put your library path here"/>
</junit>
使用jvmarg设置库加载路径:
<junit>
<jvmarg value="-Djava.library.path=/blah/YOURPATH"/>
如果要将目录添加到现有路径,则需要使用Ant 使用环境变量的能力:
<property environment="env"/>
<junit>
<jvmarg value="-Djava.library.path=${env.path}${path.separator}/blah/PATH"/>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.