我想分发Windows上用Java编写的命令行应用程序。

我的应用程序以zip文件的形式分发,其中有一个lib目录条目,其中包含调用主类所需的.jar文件。 当前,对于Unix环境,我有一个Shell脚本,该脚本使用CLASSPATH调用java命令,该CLASSPATH是通过在lib目录中附加所有文件而创建的。

如何编写具有类似功能的.BAT文件? Windows世界中的find Unix命令等效于什么?

您要在批处理脚本中使用for循环

@echo off
setLocal EnableDelayedExpansion
set CLASSPATH="
for /R ./lib %%a in (*.jar) do (
set CLASSPATH=!CLASSPATH!;%%a
)
set CLASSPATH=!CLASSPATH!"
echo !CLASSPATH!

当我正在寻找一个批处理脚本来遍历目录中的所有文件时,这确实对我有所帮助。这是关于删除文件的操作,但它非常有用。

单行批处理脚本删除空目录

老实说,尽管使用Jon的答案,但如果所有文件都在一个目录中会更好,但这可能会在另一时间帮助您。

+1,因为它是唯一回答特定问题的人。

你真的做了我的一天。谢谢您的回复

如果使用推入式/弹出式窗口,则需要在弹出式窗口前先" endLocal"。

不适用于我,理解起来也很复杂

为什么要使用查找?大概您提前知道了jar文件需要的所有库,那么为什么不列出它们呢?

或者,您始终可以使用-Djava.ext.dirs=lib并让它以这种方式拾取所有内容。

乔恩,我不知道java.ext.dirs系统属性-谢谢!想象一个应用程序,您希望用户将驱动程序jar放到lib目录中,编辑属性文件并使用JDBC连接到数据库-我的应用程序是类似的,而且我不知道CLASSPATH。

@binil:是的,这很有道理。只是您在问题中的描述,听起来您需要的所有文件都在zip文件中。

更改-Djava.ext.dirs是有问题的。例如,当我尝试使用-Djava.ext.dirs时,SSL证书验证会中断。

@KannanGoundan:您还应该能够在该路径中包含以前的扩展目录。

@JonSkeet:我试图编写一个启动程序脚本以与我的程序一起分发。有一种简单的方法可以弄清楚我以前的扩展目录是什么?

@KannanGoundan:恐怕我不是一无是处。它可能很简单,但我很困:)

从6.0开始,Java支持通配符类路径。

Java命令行类路径语法

谢谢,我不知道此功能!但是我的目标环境是Java5,因此我可能无法在此应用程序中使用此技术。

但是不幸的是,Manifest.MF不支持它

如果您希望CLASSPATH设置保留在脚本之外,并且没有使用/ V启动外壳,则可以执行以下操作:

@echo off
FOR /R ./lib %%a in (*.jar) DO CALL :AddToPath %%a
ECHO %CLASSPATH%
GOTO :EOF
:AddToPath
SET CLASSPATH=%1;%CLASSPATH%
GOTO :EOF

当您只是在命令行上玩耍时,对设置环境很有用。

肯定值得多加一点

听起来可执行JAR可以为您工作。如果要分发包含您的主要例程所需的所有JAR的ZIP,并且确实在命令外壳中执行该ZIP,则可以使用清单中定义的Main-Class和Classpath创建可执行的JAR。您所有用户需要做的就是双击JAR,而Bob是您叔叔。

是的,谢谢您提醒我该选项!我认为我应该考虑带有适当清单清单的可执行JAR。

SET CLASSPATH=""
FOR /R /lib %%a in (*.jar) DO CALL :AddToPath %%a
echo %CLASSPATH%
java -cp %CLASSPATH% com.a.b.MyClass
pause
:AddToPath
SET CLASSPATH=%1;%CLASSPATH%
GOTO :EOF

使事物可移植的一个选项是相对于批处理文件本身的位置设置类路径。

在Windows中(假设Java 6 +,。/ bin中的类,。/ lib中的jars):

@java -classpath %~dp0/bin;%~dp0/lib/* ClassName %1

Is there an easier way to do this?

是;

从版本6开始,您可以使用类路径通配符。

javac -cp .;../lib/* yourJavaCodeDir/YourJavaFile.java

另请参阅此相关问答。

如果使用Maven生成项目,则可能会使用一些不同的方法。

应用程序汇编器Maven插件旨在创建Java应用程序启动器。该插件为您生成bat文件启动器,并将依赖项放在指定的文件夹中。您也可以选择启动器将应用程序注册为service demon。

这是有关使用它的主题

此插件有助于使您的项目的CM部分保持干燥。

发行适用于Windows / Linux的命令行JAR时,我的工作是使用ANT命令将所有JAR库嵌入到我的JAR中:

这样,库与类文件融为一体。

这不是二进制可重用性的最佳方法,但是如果库不是那么繁重,则可以通过在任何OS中简单地调用java -jar myApp.jar来执行应用程序。

我(认为我)不能使用这种" uberjar"的想法,因为我使用了两个弹簧罐,它们在同名的条目中嵌入了不同的XML模式定义,我可能需要手工合并它们,这将是一个额外的构建步骤。