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

将包含Java代码的多个文件夹转换为可运行的jar文件,java,shell,jar,executable-jar,Java,Shell,Jar,Executable Jar,我的机器上有一些Java代码,可以从命令行运行。我想从这段代码中创建一个可运行的.jar文件,以便更轻松地分发我的应用程序 代码位于四个文件夹中,分别称为fol\u a、fol\u b、fol\u c和fol\u d。其中每一个都包含一个子文件夹/bin,其中包含.class文件,其中两个(fola和folb)也包含一个/lib文件夹,其中包含一些代码需要的.jar文件 fol\u d包含要运行的类Demo,该类位于名为machineLearning的包中。类的完整路径是 fol_d/bin/m

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

代码位于四个文件夹中,分别称为
fol\u a
fol\u b
fol\u c
fol\u d
。其中每一个都包含一个子文件夹
/bin
,其中包含
.class
文件,其中两个(
fola
folb
)也包含一个
/lib
文件夹,其中包含一些代码需要的
.jar
文件

fol\u 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> 
这可能吗?我该怎么做?我一直试图在网上找到答案,但大量的信息让我困惑

更新

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

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

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

  • 使用
    jar
    命令从合并目录创建jar文件


  • 更新

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

    如果您正在创建一个可执行JAR,那么Main Class属性必须指定完全限定的类名

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

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

    在您的评论中,您似乎在主类属性中使用了错误的类名。。。除非您在
    fol\u d.bin
    包中声明了类


    更新2

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

    package foo.bar;
    
    public class Main {
       ...
    }
    
    简单的类名是
    Main
    。完全限定的类名是
    foo.bar.Main
    。如果将该类的“.class”文件放入JAR中,则该类的JAR文件中的路径名必须为:

    /foo/bar/Main.class
    
    包名(
    foo.bar
    )映射到JAR文件索引中的目录路径;i、 e.“/foo/bar”

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

    是的,这是可能的

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

  • 使用
    jar
    命令从合并目录创建jar文件


  • 更新

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

    如果您正在创建一个可执行JAR,那么Main Class属性必须指定完全限定的类名

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

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

    在您的评论中,您似乎在主类属性中使用了错误的类名。。。除非您在
    fol\u d.bin
    包中声明了类


    更新2

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

    package foo.bar;
    
    public class Main {
       ...
    }
    
    简单的类名是
    Main
    。完全限定的类名是
    foo.bar.Main
    。如果将该类的“.class”文件放入JAR中,则该类的JAR文件中的路径名必须为:

    /foo/bar/Main.class
    
    包名(
    foo.bar
    )映射到JAR文件索引中的目录路径;i、 e.“/foo/bar”


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

    在我尝试此操作之前-
    man cp
    通知我:“cp实用程序的历史版本有一个-r选项。此实现支持该选项;但是,强烈建议不要使用它,因为它不能正确复制特殊文件、符号链接或fifo。”我应该担心这个吗?用-R代替。不确定我是否理解正确。我所做的是(1)将我的四个
    fol\u
    文件夹放入另一个文件夹(
    my\u app
    ),(2)将cd刻录到包含
    my\u app
    的文件夹中,(3)在该文件夹中,创建了一个只包含一行的文件
    manifest.txt
    ,(4)已执行
    jar cfm my_app.jar manifest.txt my_app
    。到现在为止,一直都还不错。但是当我尝试用
    java-jar my_app.jar
    运行
    my_app.jar
    时,我得到了
    错误:无法找到或加载主类fol\u d.bin.machineLearning.Demo
    。对不起,我编辑之前的评论太晚了,无法再修改它。我的意思是:我想我确实理解您的意思,但我遇到了另一个问题。@rdv我认为在这种情况下出现的问题是包名没有反映您的中间目录