Как мне создать jar с помощью командной строки, где класс зависит от другого класса в том же проекте? (Пожалуйста, никаких инструментов для сборки!) - PullRequest
0 голосов
/ 05 октября 2018

Я пытаюсь выучить java, скорее как хобби, чем что-либо еще, принимая другой угол зрения по сравнению с моим обычным C #, где у вас на самом деле есть пространства имен и несколько классов в файле (не ranting или что-то еще).Однако я не совсем понимаю, как, по-видимому, работает процесс создания jar, по крайней мере, в отношении параметра "files-input".

Я хорошо знаю, что существуют такие инструменты сборки, как and, maven и т. Д.,Я просто хочу лучше понять весь процесс, вот и все.

Я пытаюсь создать банку из моих 2 классов, которые находятся в 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, и мне также любопытно, можно ли построить банку таким способом без предварительногоманифест.

1 Ответ

0 голосов
/ 07 октября 2018

Для любого, кто наткнулся на этот пост, причина замешательства и причина, по которой это не сработало для меня, заключается в том, что я не принял во внимание тот факт, что я создавал свою банку где-то еще, чем вкорень диска, чтобы структура 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\ .

Но он получит все файлы в этом каталоге, так что, возможно, просто будет отдельный каталог для двоичных файлов или всех файлов, которые вам нужны для вашего приложенияи еще один для исходных файлов.

...