当我在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