我制作了一个GitHub repo来帮助解释我的问题:https://github.com/matthiasdenu/jacoco-bug.但基本上,我不明白为什么javac -cp lib/ test/*
不起作用,并且失败了,错误是它找不到类(在我试图指定的类路径上的JAR中(
denu:jacoco-bug denu$ javac -cp lib/ test/*
test/TestClass.java:2: error: package org.junit does not exist
import static org.junit.Assert.assertTrue;
^
test/TestClass.java:2: error: static import only from classes and interfaces
import static org.junit.Assert.assertTrue;
^
test/TestSuite.java:1: error: package org.junit does not exist
import org.junit.ClassRule;
^
test/TestSuite.java:2: error: package org.junit.runners does not exist
import org.junit.runners.Suite;
^
test/TestSuite.java:4: error: cannot find symbol
@RunWith(Suite.class)
^
symbol: class RunWith
test/TestSuite.java:5: error: package Suite does not exist
@Suite.SuiteClasses({
^
test/TestClass.java:7: error: cannot find symbol
@Test
^
symbol: class Test
location: class TestClass
test/TestSuite.java:4: error: cannot find symbol
@RunWith(Suite.class)
^
symbol: class Suite
8 errors
denu:jacoco-bug denu$
试试这个:
javac -cp lib/*;test/*
为什么会这样?
;
(或某些操作系统上的:
(是路径分隔符。您需要这样做,因为-cp
只接受一个参数(可以是由路径分隔符分隔的多个路径(lib/*
应该与lib
文件夹中的所有jar相匹配test/*
应该与test
文件夹中的所有jar相匹配
lib/
目录。我的源文件位于src/
和test/
目录中。
正如Geoffrey De Smet的回答中提到的,classpath选项需要一个参数。
$ java -cp lib/junit-4.13.2.jar src/* test/*
部分解决了我的问题。
要在lib/
中添加所有JAR,我需要将每个*.jar
文件添加到类路径参数中,用路径分隔符分隔。
Ant允许您使用fileset
来执行此操作。
<target name="build" depends="ivy" description="--> compile and build this test project">
<mkdir dir="out/classes" />
<path id="classpath">
<fileset dir="lib" includes="*.jar"/>
</path>
<javac classpathref="classpath" destdir="out/classes" includeantruntime="false">
<src path="src"/>
<src path="test"/>
</javac>
</target>
GitHub提交:https://github.com/matthiasdenu/jacoco-bug/commit/a57fb5957bcc43c9c05a304a61b6ea956e1cca00
假设test/*
只与*.java
文件匹配,您需要以下内容之一:
javac -cp lib/something.jar test/*.java
这将一个JAR文件放在类路径上
javac -cp lib/something.jar;lib/another.jar test/*.java # Windows
javac -cp lib/something.jar:lib/another.jar test/*.java # linux or Mac
这将把两个JAR文件放在类路径上。请注意,与其他平台相比,Windows上使用了不同的类路径分隔符。
javac -cp 'lib/*.jar' test/*.java
这是使用类路径通配符来匹配lib
目录中的所有JAR文件。注意,我引用了CCD_;球化";关于论点。CCD_ 20需要由CCD_ 21自身来处理。
有关设置类路径的更多信息,请参阅https://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html
但是,我强烈建议您不要通过从命令行或笨拙的shell脚本或barch文件运行javac
来进行构建。相反,学习Java构建工具,如Maven、Gradle、Ant等。Maven和Gradle了解如何从远程存储库中检索依赖项,他们将负责为您组装类路径。