将带有Java代码的多个文件夹转换为可运行的jar文件

时间:2017-04-02 14:58:01

标签: java shell jar executable-jar

我在我的机器上有一些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> 

其中<param_1><param_5>MainDemo方法的参数。

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

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

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

更新

右键!所以我需要做的就是这样:

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

1 个答案:

答案 0 :(得分:2)

是的,这是可能的。

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

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

  3. <强>更新

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

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

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

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

    在您的评论中,您似乎在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文件中的路径名不是那个,那么类加载器将找不到它。