使用外部 .jar 的 Java 命令行

31

我使用.jar文件来重用代码开发项目。

因此,我有一个名为TOOLS.jar的.jar文件,并且我在名为HelloWorld.java的文件中开发了一个简单的应用程序,它引用了我的TOOL包中的内容,这些内容来自TOOLS.jar。

我使用以下命令行进行编译:

javac -g -d C:\MyApp -cp TOOLS.jar HelloWorld.java

我的操作成功了,现在我想执行我的应用程序,使用以下命令(我在C:\MyApp文件夹中):

java -cp <path>\TOOLS.jar;. HelloWorld

操作成功了,但我的问题是:

当我有多个外部.jar文件的时候,我该如何执行我的应用程序?

我必须在命令中使用 -cp 选项添加每一个文件吗?

是否有一种方法可以生成只有一个可执行文件并执行它(就像C程序的.exe文件)?

2个回答

48

使用以下方式将每个jar文件参数连接到cp:

; on Windows
: on Linux or Mac

例如

java -cp <path>\TOOLS.jar;.;<path>\jar2.jar;<path>\jar3.jar HelloWorld

在较新的JVM(6+,我想)中,你也可以使用*来追加目录中的所有JAR文件,例如:

java -cp .;<path>\*; HelloWorld

若想更进一步创建一个单独封装的可执行文件,请参考这个问题


2
对我来说,你在这里使用“.”有点令人困惑。你在连接的参数中使用它们,并且没有解释可能会让读者感到困惑。 “.”是必要的,因为默认情况下当前目录位于类路径中;但是,如果我们明确指定类路径,我们必须确保显式包含当前目录。 - Paul

3
如果您有许多JAR文件放在一个文件夹里,不想手动将它们追加到类路径中。您可以在Windows上使用.bat或者在Linux上使用shell脚本。
cpappend.bat来自Tomcat。
rem ---------------------------------------------------------------------------
rem Append to CLASSPATH
rem
rem $Id: cpappend.bat 301115 2002-08-04 18:19:43Z patrickl $
rem ---------------------------------------------------------------------------

rem Process the first argument
if ""%1"" == """" goto end
set CLASSPATH=%CLASSPATH%;%1
shift

rem Process the remaining arguments
:setArgs
if ""%1"" == """" goto doneSetArgs
set CLASSPATH=%CLASSPATH% %1
shift
goto setArgs
:doneSetArgs
:end

另外一个批处理文件使用“for”语句将所有的jar文件附加到类路径中。
set CURRENT_DIR=%cd%
set CLASSPATH=.
for %%i in (%CURRENT_DIR%\lib\*.jar) do call cpappend.bat %%i
start java -Duser.dir=%CURRENT_DIR%  -cp %CLASSPATH% a.b.c.MainApp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接