繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM