为什么 Java 编译器找不到我的 JAR?



我制作了一个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相匹配
Ivy将依赖项(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了解如何从远程存储库中检索依赖项,他们将负责为您组装类路径。

最新更新