代码之家  ›  专栏  ›  技术社区  ›  Binil Thomas

创建Java CLASSPATH的BAT文件

  •  39
  • Binil Thomas  · 技术社区  · 16 年前

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

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

    我如何写一个。具有类似功能的BAT文件?在Windows世界中,find Unix命令的等价物是什么?

    10 回复  |  直到 16 年前
        1
  •  65
  •   n00begon Priidu Neemre    13 年前

    您想在Batch脚本中使用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的答案,如果所有文件都在一个目录中,那就更好了,不过这可能会在另一个时候对你有所帮助。

        2
  •  29
  •   Jon Skeet    16 年前

    为什么要使用find?想必你提前知道jar文件需要的所有库,那么为什么不列出它们呢?

    或者,您也可以随时使用 -Djava.ext.dirs=lib 让它以这种方式捡起一切。

        3
  •  18
  •   basszero    16 年前

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

    Java command-line classpath syntax

        4
  •  5
  •   Eric Sorensen    15 年前

    如果你希望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
    

    当你只是在命令行上玩的时候,这对设置你的环境很有用。

        5
  •  4
  •   duffymo    16 年前

    听起来像是 executable JAR 可以为你工作。如果你正在分发一个包含主例程所需的所有JAR的ZIP,并且你真的在命令shell中执行它,也许你可以使用清单中定义的main Class和Classpath创建一个可执行的JAR。您的用户所要做的就是双击JAR和Bob的叔叔。

        6
  •  2
  •   bluish dmajkic    13 年前
    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
    
        7
  •  0
  •   Demiurgo Demiurgo    16 年前

    当我为Windows/Linux发布命令行JAR时,我所做的是使用ANT命令将所有JAR库嵌入到我的JAR中:

           <fileset dir="${module.classes.dir}"/>
           <zipfileset src="${endorsed.lib.dir}/myLibrary.jar"/>
    

    通过这种方式,库与类文件融合在一起。

    这不是二进制可重用性的最佳方式,但如果库不是那么重,您只需在任何操作系统中调用java-jar myApp.jar即可执行应用程序。

        8
  •  0
  •   Andrii Khaisin    15 年前

    如果你使用Maven构建项目,你可能会使用一种稍微不同的方式。 Application Assembler Maven插件旨在创建Java应用程序启动器。此插件为您生成bat文件启动器,并将依赖项放入指定文件夹中。您的启动器可以选择将您的应用程序注册为服务\恶魔。

    This is a topic about using it

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

        9
  •  0
  •   Community CDub    5 年前

    有更简单的方法吗?

    对;

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

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

    另请参见此相关内容 Q&A.

        10
  •  0
  •   Mike Godin    8 年前

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

    在Windows中(假设Java 6+,类在./bin中,jar在./lib中):

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