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



我正在尝试学习Java,更多的是一种爱好,而不是其他任何东西,采取与我通常的C#不同的角度,在C#中,您实际上在文件中具有命名空间和多个类(不是咆哮或任何东西(。但是,我似乎不太了解 jar 创建过程是如何工作的,至少在"文件输入"参数方面。

我很清楚有构建工具,如 and,maven 等。我只是想更好地了解整个过程。

我正在尝试从我的 2 个类中创建一个 jar,这些类位于 2 个单独的包中。

以下是文件夹结构:


tryprojectpackageOneMainApp.classtryprojectpackageTwoGreeter.class

主应用.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();
}
}

迎宾员.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:UsersSomeUser>jar cfve tryapp.jar MainApp C:UsersSomeUserDesktopLearningJavatryprojectpackageOneMainApp.class C:UsersSomeUserDesktopLearningJavatryprojectpackageTwoGreeter.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:UsersSomeUser>java -jar tryapp.jar
Error: Could not find or load main class MainApp
Caused by: java.lang.ClassNotFoundException: MainApp

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

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

UsersSomeUserDesktopLearningJavatryprojectpackageOneMainApp.class
UsersSomeUserDesktopLearningJavatryprojectpackageTwoGreeter.class

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

C:UsersSomeUser>jar cfve tryapp.jar MainApp C:UsersSomeUserDesktopLearningJavatryprojectpackageOneMainApp.class C:UsersSomeUserDesktopLearningJavatryprojectpackageTwoGreeter.class

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

C:UsersSomeUser>jar cfve tryapp.jar Users.SomeUser.Desktop.LearningJava.tryproject.packageOne.MainApp  C:UsersSomeUserDesktopLearningJavatryprojectpackageOneMainApp.class C:UsersSomeUserDesktopLearningJavatryprojectpackageTwoGreeter.class

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

但是一个更好的解决方案,一个更简单的解决方案就像上面提到的@Prashant古普塔一样。

例如,只需使用:

jar cfve tryapp.jar packageOne.MainApp -C C:UsersSomeUserDesktopLearningJavatryproject .

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

最新更新