将包含Java代码的多个文件夹转换为可运行的jar文件
我的机器上有一些Java代码,可以从命令行运行。我想从这段代码中创建一个可运行的将包含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
.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文件中的路径名不是那样,那么类加载器将找不到它。是的,这是可能的
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我认为在这种情况下出现的问题是包名没有反映您的中间目录