如何使用命令行创建一个 jar,其中 class 依赖于同一项目中的另一个 class?(请不要使用构建工具!)

How do I create a jar using the command line where a class is dependent on another class in the same project?(no build tools please!)

我正在努力学习 java,更多的是作为一种爱好而不是其他任何东西,从我通常的 C# 中你实际上有名称空间和文件中的多个 classes 的角度(不是咆哮或任何东西)。但是我似乎不太明白 jar 创建过程似乎是如何工作的,至少关于 "files-input" 参数。

我很清楚有和、maven 等构建工具。我只是想更好地了解整个过程而已。

我正在尝试从我的 2 个 classes 中创建一个 jar,它们位于 2 个单独的包中。

文件夹结构如下:

tryproject\packageOne\MainApp.class
tryproject\packageTwo\Greeter.class

MainApp.java

package packageOne;

import packageTwo.Greeter;

public class MainApp{

 public static void main(String[] args){    
     Greeter greeter=new Greeter();
     greeter.setMessage("Hello World");
     greeter.sayHello();
 }
}

Greeter.java

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.class
added manifest
adding: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.jar
Error: Could not find or load main class MainApp
Caused by: java.lang.ClassNotFoundException: MainApp

我真的不明白为什么它找不到我的 MainApp class 我也很好奇是否可以在没有预制清单的情况下以这种方式构建 jar .

对于偶然发现此 post 的任何人,混淆的原因以及这对我不起作用的原因是因为我没有考虑到我正在创建我的jar 在驱动器根目录之外的其他地方,因此 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 class 文件的包,以类似于我刚刚在命令中修改的结构。因此,您需要像 package Users.SomeUser.Desktop.LearningJava.tryproject.packageOne;package Users.SomeUser.Desktop.LearningJava.tryproject.packageTwo; 这样重写它们,而不是只有 package packageOne;package packageTwo;。进口也是如此。 现在,如果您修改了所有 .java 文件并重新编译它们,您应该能够使用我之前提到的命令指令 运行 jar。

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

例如只需使用:

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

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