如何使javac找到JAR文件?(Eclipse可以看到它们)



当我在Eclipse中我的项目编译没有错误,但是当我试图用javac编译它说我错过了一些包…

我复制了下面的编译命令和一些错误文本:

javac -classpath lib/ -d bin/ src/*.java
src/Cleaner.java:5: package net.sourceforge.jgeocoder does not exist
src/MyUtilities.java:19: package org.apache.commons.codec.binary does not exist

在Eclipse中,我已经将所有. jar文件添加到构建路径中,并且程序编译得很好。

为什么当我使用javac而不是Eclipse IDE时,它不能找到jar ?

-classpath lib/将导致javac查找lib中的类文件树。如果您在那里有JAR存档,则必须使用-classpath lib/*.jar -并且可能使用CLI在*上的任何转义机制来确保它达到javac,而不是由CLI

展开。

请参阅javac命令参考(windows)

现有的答案,尽管内容丰富,但仍然让我感到疑惑,不得不浏览javac -classpath文档。以下是你可能想知道的内容:

javac -cp "lib/" Example.java将加载lib/中的所有.class文件。
javac -cp "lib/*" Example.java将加载lib/中的所有.jar文件,但不加载.class文件。
javac -cp "lib/;lib/*" Example.java将加载lib/中的所有.jar.class文件。

指出:

  • 上述示例中使用的*(通配符)字符被转义(注意*之前的)。是针对bash的,如果您正在使用其他东西,它可能会有所不同。您需要转义它,因为java sdk实用程序(如javac)有自己的解释通配符的方式。据我所知(纠正我,如果我错了),Windows命令行不展开*,所以你不需要转义它:-cp lib*应该是好的。
  • ;分隔路径,如javac -cp ".;a/;b/;c/" Example.java -这将加载.class文件在以下目录:当前目录,a, b和c。
  • 当使用分隔符(;)时,用引号包围类路径(像在示例中一样)。

只是添加到现有的答案中,以澄清使用@argfiles时的情况。

假设您有以下项目结构:

MyProject
├── lib
│   ├── lib1.jar
│   ├── lib2.jar
│   └── speciallib
│       ├── speciallib1.jar
│       └── speciallib2.jar
├── out
└── src
    └── MyClass.java

如果你要在命令行上编译它(例如使用linux的路径分隔符),你可以说

javac -d out -sourcepath src -classpath 'lib/*:lib/speciallib/*' src/MyClass.java

然而,如果你想创建一个@argfile来保持整洁,那么'*'语法将不起作用。您需要单独指定类路径中的所有.jar文件。所以这个的@argfile应该是这样的:

-d out
-sourcepath src
-classpath '
lib/lib1.jar:
lib/lib2.jar:
lib/speciallib/speciallib1.jar:
lib/speciallib/speciallib2.jar
'
src/MyClass.java

,然后像这样运行:

javac @argfile

值得庆幸的是,以自动的方式将所有.jar文件转储到文件中并不太难。例如,linux上的一个简单方法是使用find命令(也传递给sed以附加冒号路径分隔符和反斜杠用于行延续)并将其附加到argfile中。例如

find lib -name "*.jar" | sed "s/$/:\\/" >> argfile

最新更新