2017-04-02 184 views
0

我的机器上有一些Java代码,我从命令行运行。我想从此代码创建一个可运行的.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>到在Demo给予Main方法的参数。

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

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

这可能吗?我将如何做到这一点?我一直在努力在网上找到答案,但信息量混淆了我。

UPDATE

对!如此看来,所有我需要做的是这样的:

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

回答

2

是的,它是可能的。

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

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


UPDATE

当创建的JAR文件,该JAR内的路径(即,在JAR文件索引)必须与各个类别完全合格的名称相匹配。

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

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

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

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


更新2

这里是说明了有关完全限定名

package foo.bar; 

public class Main { 
    ... 
} 

简单的类名称为Main我的观点的一个范例。 完全合格的 classname是foo.bar.Main。如果你把“.class”的文件,这个类转换成JAR的路径JAR文件的类必须是:

/foo/bar/Main.class 

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

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

+0

在我尝试之前 - 'man cp'通知我: “cp实用程序的历史版本有一个-r选项,该实现支持该选项;但是强烈建议不要使用它,因为它没有正确复制特殊文件,符号链接或fifo“。 我应该担心这个吗? – rdv

+0

改为使用-R。 –

+0

不知道我是否正确理解你。我做的是(1)将我的四个'fol_'文件夹放入另一个文件夹('my_app'),(2)cd到包含'my_app'的文件夹中,(3)在该文件夹中创建一个文件'manifest .txt'只包含一行('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'时,我得到'错误:无法找到或加载主类fol_d.bin.machineLearning.Demo'。 – rdv

相关问题