BAT文件创建Java CLASSPATH

时间:2009-02-07 16:36:38

标签: java windows command-line batch-file

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

我的应用程序以zip文件的形式发布,它有一个lib目录条目,其中包含调用我的主类所需的.jar文件。目前,对于Unix环境,我有一个shell脚本,它通过附加lib目录中的所有文件来调用带有CLASSPATH的java命令。

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

10 个答案:

答案 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支持通配符类路径。

Java command-line classpath syntax

答案 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)

  

有更简单的方法吗?

是;

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

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

另请参阅此相关Q&A.

答案 9 :(得分:0)

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

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

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