【问题标题】:Turn multiple folders with Java code into runnable jar file将包含 Java 代码的多个文件夹转换为可运行的 jar 文件
【发布时间】:2017-08-27 10:41:04
【问题描述】:

我的机器上有一些从命令行运行的 Java 代码。我想从此代码创建一个可运行的.jar 文件,以便我可以更轻松地分发我的应用程序。

代码位于四个文件夹中,分别称为fol_afol_bfol_cfol_d。其中每一个都包含一个/bin 子文件夹,其中包含.class 文件,其中两个(fol_afol_b)还包含一个/lib 文件夹,其中包含一些代码需要的.jar 文件。

fol_d 包含要运行的类Demo,它位于名为machineLearning 的包中。类的完整路径是

fol_d/bin/machineLearning/Demo 

我目前从命令行运行代码如下:

$ cd fol_d/bin
$ java -cp ".:../../fol_a/bin:../../fol_a/lib/*:../../fol_b/bin:../../fol_b/lib/*:../../fol_c/bin" machineLearning.Demo <param_1> <param_2> ... <param_5> 

其中&lt;param_1&gt;&lt;param_5&gt;DemoMain 方法的参数。

我想要的是创建一个单一的.jar 文件,其中包含成功执行Demo 所需的所有代码,即fol_afol_d 中的代码。然后我希望能够从命令行运行这个.jar 文件,并为其提供Demo 中的Main 方法的参数。像这样的:

$ java -jar MyApplication.jar <param_1> ... <param_5>

这可能吗?我该怎么做?我一直试图在网上找到答案,但信息量让我感到困惑。

更新

对!所以看来我需要做的就是:

  • bin 目录的内容复制到新目录myapp
  • 制作一个 manifest.txt 文件,指定要运行的主类以及类路径
  • 罐子myapp:$ jar cmf manifest.txt myapp.jar -C myapp/ .
  • 执行jar:$ java -jar myapp.jar &lt;arg_1&gt; &lt;arg_2&gt; ... &lt;arg_n&gt;

【问题讨论】:

    标签: java shell jar executable-jar


    【解决方案1】:

    是的,这是可能的。

    1. 使用“cp -R”将所有 4 个文件夹的 bin 目录复制到一个目录中……保留子目录结构。 (如果您不了解如何操作,请阅读man cp。如果未安装手动条目,请安装它们。)

    2. 使用jar 命令从统一目录创建 JAR 文件。


    更新

    当您创建 JAR 文件时,JAR 中的路径(即 JAR 文件索引中)必须与相应的类完全限定名称匹配。

    如果您要创建可执行 JAR,则 Main Class 属性必须指定完全限定的类名。

    如果您错误地命名 JAR 文件条目,那么 java 将找不到类,或者它将拒绝加载它们,因为路径名和类名不匹配。

    这些要求适用于所有 JAR,但从您的 cmets 看来,您似乎忽略了这一点。

    在您的评论中,您似乎在 Main Class 属性中使用了错误的类名......除非您在 fol_d.bin 包中声明了该类!


    更新 2

    这是一个例子来说明我关于完全限定类名的观点

    package foo.bar;
    
    public class Main {
       ...
    }
    

    简单的类名是Main完全限定类名是foo.bar.Main。如果您将此类的“.class”文件放入 JAR,则该类的路径名JAR 文件必须是:

    /foo/bar/Main.class
    

    包名(foo.bar)映射到JAR文件索引中的目录路径;即“/foo/bar”。

    如果 JAR 文件中的路径名不是那个,那么类加载器将找不到它。

    【讨论】:

    • 在我尝试之前 - man cp 告诉我:“cp 实用程序的历史版本有一个 -r 选项。此实现支持该选项;但是,强烈建议不要使用它,因为它不正确复制特殊文件、符号链接或 fifo。”我应该担心这个吗?
    • 使用 -R 代替。
    • 不确定我是否理解正确。我所做的是 (1) 将我的四个 fol_ 文件夹放入另一个文件夹 (my_app),(2) cd 到包含 my_app 的文件夹,(3) 在该文件夹中,创建一个文件 @987654336 @ 仅包含一行 (Main-Class: fol_d/bin/machineLearning.Demo),并且 (4) 执行了 jar cfm my_app.jar manifest.txt my_app。到目前为止,一切都很好。但是当我尝试使用java -jar my_app.jar 运行my_app.jar 时,我得到Error: Could not find or load main class fol_d.bin.machineLearning.Demo
    • 抱歉 - 我编辑之前的评论为时已晚,不允许再更改它。我的意思是:我想我确实理解你,但我遇到了另一个问题。
    • @rdv 我认为在这种情况下出现问题的是包名称没有反映您的中间目录结构:您的Demo.java顶部的相应包名称应该是fol_d.bin.machineLearning,如果我正确理解了您问题中的文字,则不会。例如,我有像 nl.marcelkorpel.dao 这样的(Maven 结构)包,其中包含像 DAOFactory 这样的类,在文件顶部包含 package nl.marcelkorpel.dao;。目录结构反映了这一点。另请看stackoverflow.com/a/18146453/258127
    猜你喜欢
    • 2014-01-17
    • 1970-01-01
    • 2018-01-28
    • 1970-01-01
    • 2012-03-10
    • 2016-12-05
    • 1970-01-01
    • 2013-06-08
    • 2017-07-04
    相关资源
    最近更新 更多