【问题标题】:Including all the jars in a directory within the Java classpath在 Java 类路径中的一个目录中包含所有 jar
【发布时间】:2010-09-18 04:31:31
【问题描述】:

有没有办法将所有 jar 文件包含在类路径的目录中?

我正在尝试java -classpath lib/*.jar:. my.package.Program,但它无法找到肯定在这些 jar 中的类文件。我是否需要将每个 jar 文件分别添加到类路径中?

【问题讨论】:

  • 对不起,我从来没有接受过这个。它应该是一个社区维基。从未使用过提供的答案之一。我相信我创建了一个 shell 脚本,它只扫描了 lib/ 目录并通过解析文件名创建了类路径。
  • 这个新的 Java 功能存在某种错误,因为它不像描述的那样工作。如其中一个答案所述,我放弃并使用 Ant 来解决它。
  • Windows 中的通配符处理存在问题。 stackoverflow.com/questions/11607873/…
  • 一开始我以为jar:后面的.是错误的,但是.....'当前目录'的标准符号在Unix和Windows中都是一个句点(.)系统。
  • 简答:(1) 删除 .jar 部分,(2) 必须有至少 2 个部分,在 Windows 上用 ; 分隔(通常是: 其他地方)。例如:java -classpath ".;lib/*" Program

标签: java command-line classpath


【解决方案1】:

您需要单独添加它们。或者,如果您真的 只需要指定一个目录,您可以将所有内容解压缩到一个目录中并将其添加到您的类路径中。但是我不推荐这种方法,因为您可能会在类路径版本控制和不可管理性方面出现奇怪的问题。

【讨论】:

  • 这可能是回到 08 年的唯一方法,但现在不是了。
【解决方案2】:

将 jar 文件视为目录结构的根。是的,您需要单独添加它们。

【讨论】:

    【解决方案3】:

    如果您确实需要动态指定所有 .jar 文件,您可以使用 shell 脚本或Apache Ant。有一个名为 Commons Launcher 的公共项目,它基本上可以让您将启动脚本指定为 ant 构建文件(如果您明白我的意思的话)。

    然后,您可以指定如下内容:

    <path id="base.class.path">
        <pathelement path="${resources.dir}"/>
        <fileset dir="${extensions.dir}" includes="*.jar" />
        <fileset dir="${lib.dir}" includes="*.jar"/>
    </path>
    

    在您的启动构建文件中,它将使用正确的类路径启动您的应用程序。

    【讨论】:

      【解决方案4】:

      我们通过部署一个 ma​​in jar 文件 myapp.jar 来解决这个问题,该文件包含一个 ma​​nifest (Manifest.mf) 文件,该文件指定了一个包含其他所需 jar 的类路径,然后将其部署在它旁边。在这种情况下,您只需要在运行代码时声明java -jar myapp.jar

      因此,如果您将主 jar 部署到某个目录中,然后将依赖 jar 放入该目录下的 lib 文件夹中,则清单如下所示:

      Manifest-Version: 1.0
      Implementation-Title: myapp
      Implementation-Version: 1.0.1
      Class-Path: lib/dep1.jar lib/dep2.jar
      

      注意:这是独立于平台的 - 我们可以使用相同的 jar 在 UNIX 服务器或 Windows PC 上启动。

      【讨论】:

      • 这似乎适用于很多人,但是,Java 似乎在这里明显忽略了清单文件中的 Class-Path 条目。如果不使用 -cp 手动将“lib/*”添加到类路径中,我们将无法运行应用程序。有什么想法吗?
      • oxbow_lakes 的回答并不完全正确;如果您使用 java -jar myapp.jar 启动此 jar,则 Class-Path 将被尊重(并且仅被尊重;-cp/-classpath 被忽略!)。我想 oxbow_lakes 是在写“java -classpath myapp.jar”时写的。
      【解决方案5】:

      使用 Java 6 或更高版本,classpath 选项支持通配符。请注意以下几点:

      • 使用直引号 (")
      • 使用*,而不是*.jar

      Windows

      java -cp "Test.jar;lib/*" my.package.MainClass

      Unix

      java -cp "Test.jar:lib/*" my.package.MainClass

      这类似于 Windows,但使用 : 而不是 ;。如果不能使用通配符,bash 允许使用以下语法(其中 lib 是包含所有 Java 归档文件的目录):

      java -cp "$(printf %s: lib/*.jar)"

      (请注意,使用类路径与 -jar 选项不兼容。另请参阅:Execute jar file with multiple classpath libraries from command prompt

      理解通配符

      来自Classpath 文档:

      类路径条目可以包含基本名称通配符*,这被认为等同于指定所有文件的列表 在扩展名为.jar.JAR 的目录中。例如, 类路径条目foo/*指定目录中的所有JAR文件名为 富。仅由 * 组成的类路径条目扩展为所有 当前目录下的jar文件。

      包含* 的类路径条目将与类文件不匹配。到 匹配单个目录 foo 中的类和 JAR 文件,使用任一 foo;foo/*foo/*;foo。选择的顺序决定了 foo 中的类和资源在 foo 中的 JAR 文件之前加载,或者 反之亦然。

      不递归搜索子目录。例如,foo/* 看起来 仅适用于 foo 中的 JAR 文件,不适用于 foo/barfoo/baz 等中。

      目录中的 JAR 文件在目录中的枚举顺序 未指定扩展的类路径,并且可能因平台而异 平台,甚至时不时地在同一台机器上。一种 结构良好的应用程序不应依赖于任何特定的 命令。如果需要特定订单,则 JAR 文件可以是 在类路径中显式枚举。

      通配符的扩展是在调用之前尽早完成的 程序的 main 方法,而不是延迟,在类加载期间 过程本身。输入类路径的每个元素都包含一个 通配符被(可能为空的)元素序列替换 通过枚举指定目录中的 JAR 文件生成。为了 例如,如果目录foo 包含a.jarb.jarc.jar,则 类路径foo/* 扩展为foo/a.jar;foo/b.jar;foo/c.jar, 该字符串将是系统属性的值 java.class.path.

      CLASSPATH 环境变量的处理方式与 -classpath(或-cp)命令行选项。也就是说,通配符是 在所有这些情况下都受到尊重。但是,类路径通配符不是 在Class-Path jar-manifest 标头中获得荣誉。

      注意:由于 java 8 中的一个已知错误,windows 示例必须在条目前使用反斜杠并带有尾随星号:https://bugs.openjdk.java.net/browse/JDK-8131329

      【讨论】:

      • 该功能的文档记录很差,似乎需要满足一些不太明显的先决条件才能按预期工作。
      • +1 表示最后一个 bash/tr 技巧。这里的 Java/JamVM 不喜欢工作目录外路径的通配符,但使用 shell 通配符 + tr 显式引用每个 JAR 有效!
      • 我有一个命令java -classpath /jars/*:/anotherJarsDir/* com.test.MyClass 没有任何引号,它工作正常。我想知道为什么 shell 不扩展它并出错?
      • 也不要在 -cp 中使用~
      • 您的 windows 示例不适用于 java 8 或更早版本,但可以使用以下类路径:Test.jar;lib\* ... 正斜杠是可以的,除非在星号和其他几个前面时...见bugs.openjdk.java.net/browse/JDK-8131329
      【解决方案6】:

      我知道的唯一方法是单独做,例如:

      setenv CLASSPATH /User/username/newfolder/jarfile.jar:jarfile2.jar:jarfile3.jar:.
      

      希望有帮助!

      【讨论】:

      • 这可能是回到 08 年的唯一方法,但现在不是了。
      • 这还不是最糟糕的事情。这是一个 hack,但我在我的 bashrc 中有这个设置 for jar in $(ls $HOME/bin/*.jar); do export CLASSPATH=$jar:$CLASSPATH; done
      【解决方案7】:

      在 Windows 下可以这样:

      java -cp "Test.jar;lib/*" my.package.MainClass
      

      这不起作用:

      java -cp "Test.jar;lib/*.jar" my.package.MainClass
      

      注意*.jar所以应该单独使用 * 通配符


      在 Linux 上,以下工作:

      java -cp "Test.jar:lib/*" my.package.MainClass
      

      分隔符是冒号而不是分号

      【讨论】:

      • 完美答案。需要注意的 2 件事:1) 使用引号和 2) 仅使用 *,而不是 *.jar
      • 一年零 8 个月后,我为包含 UNIX 版本所做的编辑再次拯救了我。 :) 有趣的是,它无法识别带有 *.jar 的我的 jar 文件,但只能识别 *
      • 我发现类路径的顺序很重要(但我不知道为什么)。在切换类路径的顺序之前,我遇到了错误。
      • @jmort253,问题是,这不是shell *扩展,而是通配符是java解析classpath,看到*并填写通配符
      • @SebastianGodelet - 是的,这只是我在正则表达式通配符和这个符号之间感到困惑,我猜这不一样。大多数情况下,拯救我的是知道一个平台上的: 和另一个平台上的; 之间的区别。 :) 我大约每年从命令行使用 Java 编译一次,这足以不记得有多频繁了。
      【解决方案8】:

      对于 windows 引号是必需的,并且 ;应该用作分隔符。例如:

      java -cp "target\\*;target\\dependency\\*" my.package.Main
      

      【讨论】:

        【解决方案9】:

        你可以试试java-Djava.ext.dirs=jarDirectory http://docs.oracle.com/javase/6/docs/technotes/guides/extensions/spec.html

        运行java时的外部jar目录

        【讨论】:

        • 这可行,但要小心,在-jar之前传递-Djava.ext.dirs=
        • java.ext.dirs 的工作方式与类路径中的普通 jar 非常不同。它具有更高的优先级和权限,能够以某种方式覆盖 bootstamp(rt.jar) 中的类
        • 谢谢。在'java version "1.8.0_221" Java(TM) SE Runtime Environment (build 1.8.0_221-b27) Java HotSpot(TM) 64-Bit Server VM (build 25.221-b27, mixed mode)'上,只有这个-D版本传递类路径的工作。传统形式没有。
        【解决方案10】:

        如果您使用的是 Java 6,则可以在类路径中使用通配符。

        现在可以在类路径定义中使用通配符:

        javac -cp libs/* -verbose -encoding UTF-8 src/mypackage/*.java  -d build/classes
        

        参考:http://www.rekk.de/bloggy/2008/add-all-jars-in-a-directory-to-classpath-with-java-se-6-using-wildcards/

        【讨论】:

          【解决方案11】:

          我在 Ubuntu 10.04 上使用 java-sun 1.6.0_24 的解决方案,所有 jar 都在“lib”目录中:

          java -cp .:lib/* my.main.Class

          如果失败,下面的命令应该可以工作(将 lib 目录中的所有 *.jar 打印到类路径参数中)

          java -cp $(for i in lib/*.jar ; do echo -n $i: ; done)。我的.main.Class

          【讨论】:

          • 一个有趣的笔记。 java -cp lib/* my.main.Class 总是会失败,因为 lib/* 的 shell glob 扩展,而 java -cp .:lib/* my.main.Class 不会因为 .:lib/* 不是有效的 glob小路。花点时间注意一下
          • 这不起作用; linux 会扩展。您可以尝试: java -cp '.:lib/' 并且效果很好(注意单引号!它不适用于双引号!)。实际上, .:lib/* 如果由于冒号而不是合法的 glob 可能会起作用,但感觉有点不确定。我会添加引号。单引号告诉 bash 不要触及内容的任何部分。
          • 使用单引号或双引号并不重要(在此上下文中)。您想防止外壳扩展(通配)*,仅此而已。并将文本“lib/*”直接传递给 JVM,因此 VM 将其识别为“特殊模式”并自行搜索 jar 文件。
          【解决方案12】:

          如果您在 Eclipse 或 Netbeans 等任何 IDE 之外开发和运行 Java 应用程序,上述所有解决方案都非常有效。

          如果您在 Windows 7 上并使用 Eclipse IDE 在 Java 中进行开发,如果使用命令提示符运行在 Eclipse 中构建的类文件,您可能会遇到问题。

          例如您在 Eclipse 中的源代码具有以下包层次结构: edu.sjsu.myapp.Main.java

          您将 json.jar 作为 Main.java 的外部依赖项

          当您尝试从 Eclipse 中运行 Main.java 时,它将毫无问题地运行。

          但是当你在 Eclipse 中编译 Main.java 后尝试使用命令提示符运行它时,它会发出一些奇怪的错误,说“ClassNotDef Error blah blah”。

          我假设您在源代码的工作目录中!!

          使用以下语法从命令提示符运行它:

          1. javac -cp ".;json.jar" Main.java

          2. java -cp ".;json.jar" edu.sjsu.myapp.Main

            [不要错过 .以上]

          这是因为您已将 Main.java 放在包 edu.sjsu.myapp 中,而 java.exe 将查找确切的模式。

          希望对你有帮助!!

          【讨论】:

            【解决方案13】:

            简答:java -classpath lib/*:. my.package.Program

            Oracle 在了解类路径通配符部分标题下提供了有关在类路径 here for Java 6here for Java 7 中使用通配符的文档。 (在我写这篇文章时,这两页包含相同的信息。)以下是重点摘要:

            • 一般来说,要包含给定目录中的所有 JAR,您可以使用通配符 *not *.jar)。

            • 通配符只匹配 JAR,不匹配类文件;要获取目录中的所有类,只需在目录名称处结束类路径条目即可。

            • 上述两个选项可以结合使用,以将所有 JAR 和类文件包含在一个目录中,并且适用通常的类路径优先规则。例如。 -cp /classes;/jars/*

            • 通配符不会在子目录中搜索 JAR。

            • 如果您使用CLASSPATH 系统属性或-cp-classpath 命令行标志,上述要点是正确的。但是,如果您使用 Class-Path JAR 清单标头(就像您可能对 ant 构建文件所做的那样),通配符将被接受。

            是的,我的第一个链接与得分最高的答案中提供的链接相同(我没有希望超越),但该答案并没有提供超出链接的太多解释。由于这种行为是 Stack Overflow these days 上的 discouraged,我想我会对其进行扩展。

            【讨论】:

            • 我的问题在于 lib/*.jar 而不是 lib/*。非常感谢这解决了它。我注意到 : 和 ; 之间有区别但这可能是我在同一时间进行多次测试的那种事情。
            • 感谢您强调 * 和 *.jar 之间的区别
            • 我不确定为什么要为“.”添加额外的类路径条目解决了我的问题,但现在可以了。 “。”是与我用通配符指定的目录相同的目录。我不明白为什么这很重要,但确实如此。谢谢!
            【解决方案14】:

            正确

            java -classpath "lib/*:." my.package.Program
            

            不正确:

            java -classpath "lib/a*.jar:." my.package.Program
            java -classpath "lib/a*:."     my.package.Program
            java -classpath "lib/*.jar:."  my.package.Program
            java -classpath  lib/*:.       my.package.Program
            

            【讨论】:

            • java -classpath "lib/*:." my.package.Program 对我有用
            【解决方案15】:

            对我来说,这适用于 Windows。

            java -cp "/lib/*;" sample
            

            Linux

            java -cp "/lib/*:" sample
            

            我正在使用Java 6

            【讨论】:

            • windows 示例似乎适用于 java 6,也许是 java 7,但不适用于 java 8(请参阅bugs.openjdk.java.net/browse/JDK-8131329
            • 适用于 linux 中的 java 8
            • java -cp "Test.jar;lib/*" my.package.MainClass 这不会在 lib 下寻找子文件夹吗?例如我的 jar 在目录 lib/org/abc.ja
            【解决方案16】:

            短格式:如果你的 main 在一个 jar 中,你可能需要一个额外的 '-jar pathTo/yourJar/YourJarsName.jar '明确声明让它工作(即使 'YourJarsName.jar' 在类路径上) (或者,表达回答 5 年前提出的原始问题:您不需要明确地重新声明每个 jar,但似乎,即使使用 java6,您也需要重新声明自己的 jar ...)


            长格式: (我已经明确表达了这一点,我希望即使是 java 的闯入者也能利用这一点)

            像这里的许多人一样,我使用 eclipse 来导出 jars:(文件->导出-->'可运行的 JAR 文件')。 '库处理' eclipse (Juno) 提供三个选项:

            opt1: "Extract required libraries into generated JAR"
            opt2: "Package required libraries into generated JAR"
            opt3: "Copy required libraries into a sub-folder next to the generated JAR"
            

            通常我会使用 opt2(并且 opt1 肯定会破坏),但是我正在使用的其中一个 jar 中的本机代码发现在您选择该选项时 eclipse 会利用方便的“jarinjar”技巧破坏。即使在意识到我需要 opt3,然后找到这个 StackOverflow 条目之后,我仍然花了一些时间来弄清楚如何在 eclipse 之外启动我的 main,所以这对我有用,因为它对其他人有用......


            如果您将 jar 命名为:“fooBarTheJarFile.jar” 并且全部设置为导出到目录:“/theFully/qualifiedPath/toYourChosenDir”。

            (意味着“导出目的地”字段将显示为:“/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar”)

            点击完成后,您会发现 eclipse 然后将所有库放入该导出目录中名为“fooBarTheJarFile_lib”的文件夹中,为您提供如下内容:

            /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar
            /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar01.jar
            /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar02.jar
            /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar03.jar
            /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/SomeOtherJar04.jar
            

            然后您可以从系统上的任何位置启动:

            java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*" -jar  /theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar   package.path_to.the_class_with.your_main.TheClassWithYourMain
            

            (对于 Java 新手:'package.path_to.the_class_with.your_main' 是声明的包路径,您可以在包含 'main(String[] args) 的 'TheClassWithYourMain.java' 文件的顶部找到它{...}' 你希望从外部 java 运行)


            需要注意的缺陷是:在声明的类路径中的 jar 列表中包含“fooBarTheJarFile.jar”是不够的。您需要显式声明“-jar”,并重新声明该 jar 的位置。

            例如这打破了:

             java -classpath "/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile.jar;/theFully/qualifiedPath/toYourChosenDir/fooBarTheJarFile_lib/*"  somepackages.inside.yourJar.leadingToTheMain.TheClassWithYourMain
            

            用相对路径重述:

            cd /theFully/qualifiedPath/toYourChosenDir/;
            BREAKS:  java -cp "fooBarTheJarFile_lib/*"                                package.path_to.the_class_with.your_main.TheClassWithYourMain    
            BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"                              package.path_to.the_class_with.your_main.TheClassWithYourMain   
            BREAKS:  java -cp ".;fooBarTheJarFile_lib/*"   -jar                       package.path_to.the_class_with.your_main.TheClassWithYourMain   
            WORKS:   java -cp ".;fooBarTheJarFile_lib/*"   -jar  fooBarTheJarFile.jar package.path_to.the_class_with.your_main.TheClassWithYourMain   
            

            (使用 java 版本“1.6.0_27”;通过 ubuntu 12.04 上的 OpenJDK 64 位服务器 VM)

            【讨论】:

              【解决方案17】:

              请注意,Windows 上 Java 7 的通配符扩展被破坏。

              查看this StackOverflow issue了解更多信息。

              解决方法是在通配符之后放置一个分号。 java -cp "somewhere/*;"

              【讨论】:

                【解决方案18】:

                它可能与谁有关,

                我在 MSYS/MinGW shell 下的 Windows 上发现了这种奇怪的行为。

                作品:

                $ javac -cp '.;c:\Programs\COMSOL44\plugins\*' Reclaim.java
                

                不起作用:

                $ javac -cp 'c:\Programs\COMSOL44\plugins\*' Reclaim.java
                javac: invalid flag: c:\Programs\COMSOL44\plugins\com.comsol.aco_1.0.0.jar
                Usage: javac <options> <source files>
                use -help for a list of possible options
                

                我很确定通配符没有被 shell 扩展,因为例如

                $ echo './*'
                ./*
                

                (也尝试了另一个程序,而不是内置的echo,结果相同。)

                我相信它是 javac 正在尝试扩展它,并且无论参数中是否有分号,它的行为都会有所不同。首先,它可能试图扩展所有看起来像路径的参数。只有这样它才会解析它们,-cp 只使用以下标记。 (请注意,com.comsol.aco_1.0.0.jar 是该目录中的第二个 JAR。)这都是猜测。

                这是

                $ javac -version
                javac 1.7.0
                

                【讨论】:

                  【解决方案19】:

                  来自 wepapp 的类:

                    > mvn clean install
                  
                    > java -cp "webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/tool-jar-1.17.0-SNAPSHOT.jar;webapp/target/webapp-1.17.0-SNAPSHOT/WEB-INF/lib/*" com.xx.xx.util.EncryptorUtils param1 param2
                  

                  【讨论】:

                    【解决方案20】:

                    能够将 /* 设置为 -cp 不是直接解决方案,但我希望您可以使用以下脚本来缓解动态类路径和 lib 目录的情况。

                     libDir2Scan4jars="../test";cp=""; for j in `ls ${libDir2Scan4jars}/*.jar`; do if [ "$j" != "" ]; then cp=$cp:$j; fi; done; echo $cp| cut -c2-${#cp} > .tmpCP.tmp; export tmpCLASSPATH=`cat .tmpCP.tmp`; if [ "$tmpCLASSPATH" != "" ]; then echo .; echo "classpath set, you can now use  ~>         java -cp \$tmpCLASSPATH"; echo .; else echo .; echo "Error please check libDir2Scan4jars path"; echo .; fi; 
                    

                    为 Linux 编写脚本,也可以为 Windows 提供类似的脚本。如果提供了正确的目录作为“libDir2Scan4jars”的输入;该脚本将扫描所有 jar 并创建一个类路径字符串并将其导出到环境变量“tmpCLASSPATH”。

                    【讨论】:

                      【解决方案21】:

                      以适合多个 jar 和当前目录的类文件的方式设置类路径。

                      CLASSPATH=${ORACLE_HOME}/jdbc/lib/ojdbc6.jar:${ORACLE_HOME}/jdbc/lib/ojdbc14.jar:${ORACLE_HOME}/jdbc/lib/nls_charset12.jar; 
                      CLASSPATH=$CLASSPATH:/export/home/gs806e/tops/jconn2.jar:.;
                      export CLASSPATH
                      

                      【讨论】:

                        【解决方案22】:

                        Windows

                         java -cp file.jar;dir/* my.app.ClassName
                        

                        Linux

                         java -cp file.jar:dir/* my.app.ClassName
                        

                        提醒:
                        - Windows 路径分隔符为;
                        - Linux 路径分隔符为:
                        - 在 Windows 中,如果 cp 参数不包含空格,“引号”是可选的

                        【讨论】:

                        • windows 示例不适用于 java 8 及更早版本:请参阅 bugs.openjdk.java.net/browse/JDK-8131329
                        • 可能对open JDK不起作用,我测试一下这里再说
                        • 抱歉,我用 HotSpot 进行了测试,我认为它适用于 openjdk。
                        • windows下的Oracle java在星号之前需要一个反斜杠而不是一个正斜杠,尽管我没有重新测试最新的或替代的java版本。
                        • java -cp "Test.jar;lib/*" my.package.MainClass 这不会在 lib 下寻找子文件夹吗?例如我的 jar 在目录 lib/org/abc.ja
                        【解决方案23】:

                        我在一个文件夹中有多个 jar。以下命令在JDK1.8 中为我工作,包括文件夹中存在的所有罐子。请注意,如果您在类路径中有空格,请包含在引号中

                        Windows

                        编译:javac -classpath "C:\My Jars\sdk\lib\*" c:\programs\MyProgram.java

                        跑步:java -classpath "C:\My Jars\sdk\lib\*;c:\programs" MyProgram

                        Linux

                        编译:javac -classpath "/home/guestuser/My Jars/sdk/lib/*" MyProgram.java

                        正在运行:java -classpath "/home/guestuser/My Jars/sdk/lib/*:/home/guestuser/programs" MyProgram

                        【讨论】:

                          【解决方案24】:

                          macOS,当前文件夹

                          对于macOS Mojave 上的 Java 13...

                          如果您的所有.jar 文件都在同一个文件夹中,请使用cd 将其设为您的current working directory。使用pwd 进行验证。

                          对于-classpath,您必须首先为您的应用列出JAR file。使用冒号字符 : 作为分隔符,附加星号 * 以获取同一文件夹中的所有其他 JAR 文件。最后,使用 main method 传递类的完整包名。

                          例如,对于名为 my_app.jar 的 JAR 文件中的应用,在名为 App 的类中的 main 方法在名为 com.example 的包中,以及同一文件夹中的一些所需 jar:

                          java -classpath my_app.jar:* com.example.App
                          

                          【讨论】:

                            【解决方案25】:

                            java 命令的参数顺序也很重要:

                            c:\projects\CloudMirror>java Javaside -cp "jna-5.6.0.jar;.\"
                            Error: Unable to initialize main class Javaside
                            Caused by: java.lang.NoClassDefFoundError: com/sun/jna/Callback
                            

                            c:\projects\CloudMirror>java -cp "jna-5.6.0.jar;.\" Javaside
                            Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable
                            

                            【讨论】:

                              猜你喜欢
                              • 2010-09-16
                              • 2012-02-15
                              • 2023-03-18
                              • 1970-01-01
                              • 2012-10-11
                              • 2014-08-09
                              • 1970-01-01
                              • 2019-02-22
                              相关资源
                              最近更新 更多