Не запускается jar при сбоке из другой директории
.
└── src
├── META-INF
│ └── MANIFEST.MF
└── com
└── company
└── Main.java
Main.java:
package com.company;
public class Main {
public static void main(String[] args) {
System.out.println("Hello");
}
}
MANIFEST.MF:
Manifest-Version: 1.0
Main-Class: com.company.Main
Выполняю из папки src
javac com/company/Main.java
jar -cvfm out.jar META-INF/MANIFEST.MF com/company/*.class
java -jar out.jar
Всё ок
Но если из уровня выше:
javac src/com/company/Main.java
jar -cvfm out.jar src/META-INF/MANIFEST.MF src/com/company/*.class
java -jar out.jar
То получаю:
Error: Could not find or load main class com.company.Main
Caused by: java.lang.ClassNotFoundException: com.company.Main
Почему так происходит?
Ответы (1 шт):
Если вы хотите запускать jar в таком виде то вам нужно добавить package src.com.company; в классе и Main-Class: src.com.company.Main в манифесте. Тогда все будет работать как задумано.
А если же отталкиваться от того что у вас в файлах:
Когда вы создаете jar, первый каталог пакета (в основном com), должен быть первым в архиве, а вы должны находиться уровнем выше него (как раз в src, в нашем случае) ибо в противном случае в архив попадает все что ниже. Например: когда вы архивировали с уровня выше то в архив попадала директория src, которая из за этого превращалась в его первый уровень. Но в манифесте прописано что в пути com/company/Main.java первой будет директория com и при из за этого обращении к main файлу ничего не находится.
Кстати. Папку META-INF самому делать не обязательно. Архиватор генерирует её саму и создает там MANIFEST.MF скопировав туда данные из указанного вами манифеста.
Я не эксперт в этой теме, но объяснил как мог и сам понимаю. Надеюсь с какими-нибудь вопросами помог.