NoClassDefFoundError при компиляции программы HelloWorld в банку

Вот что у меня есть.

У меня есть папка MyJava, в которой все содержится.

MyJava/src/a/HelloWorld.java
MyJava/src/b/Inner.java
MyJava/bin/
MyJava/manifest.txt

HelloWorld.java:

public class HelloWorld {

    public static void main(String[] args) {

        System.out.println("Hello, World");

        Inner myInner = new Inner(); 
        myInner.myInner(); 
    }
}

Внутренний.java:

public class Inner {

    public void myInner() {
        System.out.println("Inner Method");
    }
}

Манифест.txt:

Main-Class: HelloWorld

Сначала я компилирую .javas в .class:

javac -d bin src/a/HelloWorld.java src/b/Inner.java

Теперь я помещаю их в файл .jar jar cvfm myTwo.jar manifest.txt bin/*.class

теперь я пытаюсь запустить банку: java -jar myTwo.jar

И я получаю:

Exception in thread "main" java.lang.NoClassDefFoundError: HelloWorld
...
Could not find the main class: HelloWorld. Program will exit.

Я знаю, что это довольно простая проблема, что мне не хватает?


person dwjohnston    schedule 15.05.2013    source источник
comment
Это не часть пакета.   -  person dwjohnston    schedule 15.05.2013
comment
Почему два класса находятся в разных каталогах?   -  person Andrew Thompson    schedule 15.05.2013
comment
Ну... Я играю, разрабатывая, как мне что-то скомпилировать. Хотя что-то подобное использует пакеты.   -  person dwjohnston    schedule 15.05.2013
comment
Пакеты в исходном коде Java в локальной файловой системе обычно соответствуют каталогу, в котором хранится исходный код. Итак, если класс имеет пакет pkg.name и имя MyClass, он должен быть в пути a pkg/name/MyClass.java. Я рекомендую, если ваши классы находятся в одном и том же пакете (кажется, в пакете по умолчанию), они должны быть в одном каталоге. Есть способы сделать это по-разному, но я предлагаю вам пока придерживаться самого простого способа.   -  person Andrew Thompson    schedule 15.05.2013


Ответы (2)


Если вы просмотрите файлы внутри вашего .JAR, вы заметите, что ваши скомпилированные классы находятся внутри каталога bin (и, следовательно, не могут быть найдены, поскольку ваш манифест ссылается на класс на верхнем уровне).
Измените команду jar... следующим образом:

jar cvfm myTwo.jar manifest.txt -C bin .

См. также раздел "Создание файла JAR". учебника по Java.

person gkalpak    schedule 15.05.2013

Одним из решений является добавление следующей строки в файл manifest.txt.

Class-Path: bin/

Затем вы можете использовать «вашу» команду для создания банки:

jar cvfm myTwo.jar manifest.txt bin/*.class
person Łukasz Rzeszotarski    schedule 15.05.2013