我在我的机器上有一些Java代码,我从命令行运行。我想从此代码创建一个可运行的.jar
文件,以便我可以更轻松地分发我的应用程序。
代码分为四个文件夹,分别名为fol_a
,fol_b
,fol_c
和fol_d
。其中每个包含/bin
子文件夹,其中包含.class
个文件,其中两个(fol_a
和fol_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>
是Main
中Demo
方法的参数。
我想要的是创建一个单.jar
个文件,其中包含成功执行Demo
所需的所有代码,即fol_a
到fol_d
中的代码。然后,我希望能够从命令行运行此.jar
文件,并为Main
中的Demo
方法提供参数。像这样:
$ java -jar MyApplication.jar <param_1> ... <param_5>
这可能吗?我该怎么做?我一直试图在网上找到答案,但信息量让我感到困惑。
更新
右键!所以我需要做的就是这样:
bin
目录的内容复制到新目录myapp
myapp
:$ jar cmf manifest.txt myapp.jar -C myapp/ .
$ java -jar myapp.jar <arg_1> <arg_2> ... <arg_n>
答案 0 :(得分:2)
是的,这是可能的。
使用“cp -R”将所有4个文件夹的“bin
目录”复制到一个目录中...保留子目录结构。 (如果您不了解如何,请阅读man cp
。如果未安装,请安装手册条目。)
使用jar
命令从统一目录创建JAR文件。
<强>更新强>
创建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文件中的路径名不是那个,那么类加载器将找不到它。