簡體   English   中英

如何使用命令行在一個類依賴於同一項目中的另一個類的情況下創建jar?(請不要使用構建工具!)

[英]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#有着不同的角度,在C#中,文件中實際上有名稱空間和多個類(不包含任何內容)。 但是,我似乎不太了解jar創建過程的工作原理,至少在“ files-input”參數方面。

我知道有一些構建工具,例如and,maven等。 我只是想更好地了解整個過程。

我試圖用兩個單獨的包中的2個類創建一個jar。

這是文件夾結構:

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類,我也很好奇是否有可能在沒有預制清單的情況下以這種方式構建jar。

對於任何偶然發現此帖子的人,造成混亂的原因以及對我而言都不起作用的原因是,因為我沒有考慮到我在其他地方而不是在根目錄中創建我的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類文件的包,使其類似於我在命令中剛剛修改的結構。 因此,與其僅package packageOne;將其package packageOne; package packageTwo; 您需要像這樣package Users.SomeUser.Desktop.LearningJava.tryproject.packageOne;重寫它們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\ .

但是它將獲得該目錄中的所有文件,因此可能只有一個單獨的目錄,用於存放二進制文件或應用程序所需的所有文件,以及源文件所需的所有文件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM