我想在Windows上分发用Java编写的命令行应用程序。
我的应用程序以zip文件的形式发布,它有一个lib目录条目,其中包含调用我的主类所需的.jar文件。目前,对于Unix环境,我有一个shell脚本,它通过附加lib目录中的所有文件来调用带有CLASSPATH的java命令。
如何编写具有类似功能的.BAT文件?什么是Windows世界中的find Unix命令?
答案 0 :(得分:65)
您想在批处理脚本中使用for循环
@echo off
setLocal EnableDelayedExpansion
set CLASSPATH="
for /R ./lib %%a in (*.jar) do (
set CLASSPATH=!CLASSPATH!;%%a
)
set CLASSPATH=!CLASSPATH!"
echo !CLASSPATH!
当我在寻找一个批处理脚本来遍历目录中的所有文件时,这真的帮助了我,它是关于删除文件但它非常有用。
One-line batch script to delete empty directories
老实说,使用Jon的答案,如果所有文件都在一个目录中,那么这可能会更好。但是这可能会帮助你在另一个时间。
答案 1 :(得分:29)
为什么要使用find?大概你提前知道你的jar文件需要的所有库,那么为什么不直接列出它们呢?
或者,您可以随时使用-Djava.ext.dirs=lib
并让它以这种方式获取所有内容。
答案 2 :(得分:18)
从6.0开始,Java支持通配符类路径。
答案 3 :(得分:5)
如果您希望CLASSPATH设置保留在脚本之外且没有使用/ V启动shell,则可以执行以下操作:
@echo off
FOR /R ./lib %%a in (*.jar) DO CALL :AddToPath %%a
ECHO %CLASSPATH%
GOTO :EOF
:AddToPath
SET CLASSPATH=%1;%CLASSPATH%
GOTO :EOF
当您在命令行上玩游戏时,可用于设置环境。
答案 4 :(得分:4)
听起来像executable JAR可能适合你。如果您正在分发一个ZIP,其中包含您的主例程所需的所有JAR,并且您确实在命令shell中执行它,那么您可以使用清单中定义的Main-Class和Classpath创建一个可执行JAR。您的所有用户只需双击JAR,Bob就是您的叔叔。
答案 5 :(得分:2)
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
答案 6 :(得分:0)
当我发布Windows / Linux命令行JAR时,我要使用ANT命令将所有JAR库嵌入到JAR中:
<fileset dir="${module.classes.dir}"/>
<zipfileset src="${endorsed.lib.dir}/myLibrary.jar"/>
通过这种方式,库与您的类文件一起融合。
这不是二进制可重用性的最佳方式,但如果库不那么重,那么只需在任何操作系统中调用java -jar myApp.jar即可执行应用程序。
答案 7 :(得分:0)
如果使用Maven构建项目,可能会使用不同的方法。 Application Assembler Maven Plugin用于创建Java应用程序启动器。此插件为您生成bat文件启动器,并将依赖项放在指定的文件夹中。您可以选择将启动器注册为服务\恶魔。
This is a topic about using it
此插件有助于保持项目的CM部分干燥。
答案 8 :(得分:0)
答案 9 :(得分:0)
使事物可移植的选项是相对于批处理文件本身的位置设置类路径。
在Windows中(假设Java 6+,。/ bin中的类,。/ lib中的jars):
@java -classpath %~dp0/bin;%~dp0/lib/* ClassName %1