[英]Why can't the Java compiler find my JARs?
我制作了一个 GitHub 存储库来帮助解释我的问题: https://github.com/matthiasdenu/jacoco-bug 。 但基本上,我不明白为什么javac -cp lib/ test/*
不起作用并且失败并出现错误,说它找不到类(在我试图指定的类路径上的 JARs 中)
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
文件夹中的所有 jars。test/*
应该匹配test
文件夹中的所有 jars。 Ivy 将依赖项 (JAR) 下载到lib/
目录。 我的源文件在src/
和test/
目录中。
正如 Geoffrey De Smet 的回答中提到的,classpath 选项有一个参数。
$ java -cp lib/junit-4.13.2.jar src/* test/*
部分解决了我的问题。
要在lib/
中添加所有 JARs,我需要将每个*.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 文件。 请注意,我引用了'lib/*.jar'
试图对参数进行“通配”。 *.jar
需要由javac
自己处理。
有关设置类路径的更多信息,请参阅https://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html
但是,我强烈建议您不要通过从命令行或笨拙的 shell 脚本或 barch 文件运行javac
来进行构建。 而是学习一个 Java 构建工具,例如 Maven、Gradle、Ant 等。 Maven 和 Gradle 了解如何从远程存储库检索您的依赖项,他们会负责为您组装类路径。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.