为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用命令行创建一个 jar,其中一个类依赖于同一项目中的另一个类?

如何使用命令行创建一个 jar,其中一个类依赖于同一项目中的另一个类?

猛跑小猪 2021-10-28 14:26:54
我正在尝试学习 Java,更多的是作为一种爱好而不是其他任何东西,从我通常的 C# 中采取不同的角度,在那里你实际上在一个文件中拥有命名空间和多个类(不是咆哮或任何东西)。但是,我似乎不太明白 jar 创建过程是如何工作的,至少在“文件输入”参数方面是这样。我很清楚有像 and、maven 等构建工具。我只是想更好地了解整个过程。我正在尝试从我的 2 个类中创建一个 jar,它们位于 2 个单独的包中。这是文件夹结构:tryproject\packageOne\MainApp.classtryproject\packageTwo\Greeter.class主应用程序package packageOne;import packageTwo.Greeter;public class MainApp{ public static void main(String[] args){         Greeter greeter=new Greeter();     greeter.setMessage("Hello World");     greeter.sayHello(); }}问候语package packageTwo;public class Greeter{ private String whatTosay; public void setMessage(String whatTosay){    this.whatTosay=whatTosay; } public void sayHello(){    System.out.println(whatTosay); }}这是命令提示符输出:C:\Users\SomeUser>jar cfve tryapp.jar MainApp C:\Users\SomeUser\Desktop\LearningJava\tryproject\packageOne\MainApp.class C:\Users\SomeUser\Desktop\LearningJava\tryproject\packageTwo\Greeter.classadded manifestadding:Users/SomeUser/Desktop/LearningJava/tryproject/packageOne/MainApp.class(in = 414) (out= 299)(deflated 27%)adding:Users/SomeUser/Desktop/LearningJava/tryproject/packageTwo/Greeter.class(in = 506) (out= 333)(deflated 34%)C:\Users\SomeUser>java -jar tryapp.jarError: Could not find or load main class MainAppCaused by: java.lang.ClassNotFoundException: MainApp我真的不明白为什么它找不到我的MainApp班级,我也很好奇是否可以在没有预制清单的情况下以这种方式构建 jar。
查看完整描述

1 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

对于偶然发现这篇文章的人来说,混淆的原因以及这对我不起作用的原因是因为我没有考虑到我是在其他地方而不是在根目录中创建我的罐子这一事实驱动器,因此 jar 结构将如下所示:


Users\SomeUser\Desktop\LearningJava\tryproject\packageOne\MainApp.class

Users\SomeUser\Desktop\LearningJava\tryproject\packageTwo\Greeter.class

以上是我使用以下命令创建后的 jar 结构:


C:\Users\SomeUser>jar cfve tryapp.jar MainApp C:\Users\SomeUser\Desktop\LearningJava\tryproject\packageOne\MainApp.class C:\Users\SomeUser\Desktop\LearningJava\tryproject\packageTwo\Greeter.class

现在为了运行这个 jar,你必须改变上面的命令,而不是只有 MainApp,你必须像这样放置整个项目结构:


C:\Users\SomeUser>jar cfve tryapp.jar Users.SomeUser.Desktop.LearningJava.tryproject.packageOne.MainApp  C:\Users\SomeUser\Desktop\LearningJava\tryproject\packageOne\MainApp.class C:\Users\SomeUser\Desktop\LearningJava\tryproject\packageTwo\Greeter.class

并且您还必须修改每个 .java 类文件的包以类似于我刚刚在命令中修改的结构。因此,而不是仅仅的package packageOne;或package packageTwo;你需要重写他们这样package Users.SomeUser.Desktop.LearningJava.tryproject.packageOne;和package Users.SomeUser.Desktop.LearningJava.tryproject.packageTwo;。进口也是如此。现在,如果您修改了所有 .java 文件并重新编译它们,您应该能够使用我之前提到的命令指令运行 jar。


但是更好的解决方案和更简单的解决方案就像上面提到的@Prashant Gupta。


例如,只需使用:


jar cfve tryapp.jar packageOne.MainApp -C C:\Users\SomeUser\Desktop\LearningJava\tryproject\ .

但是它将获取该目录中的所有文件,因此可能只有一个单独的目录用于二进制文件或应用程序所需的所有文件,而另一个用于源文件。


查看完整回答
反对 回复 2021-10-28
  • 1 回答
  • 0 关注
  • 123 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信