класс Java не найден, несмотря на предоставление файла JAR - PullRequest
1 голос
/ 26 июня 2010

Я озадачен процессом запуска Java-программ, может быть, вы можете помочь.

У меня есть несколько файлов .java в ~/working_dir/org/project/, которые имеют основные функции, и я хочу упаковать их в банку для запуска. Я делаю:

cd ~/working_dir/org/projectname
javac -classpath $CLASSPATH *.java
cd ~/working_dir/
jar cf myjar.jar org/

А затем попробуйте запустить один из классов в банке, выполнив: java -cp myjar.jar org.project.SomeClass

и получите

Exception in thread "main" java.lang.NoClassDefFoundError: org/project/SomeClass
Could not find the main class: org.project.SomeClass

Что я делаю не так? Классы компилируются без каких-либо ошибок, и jar tf myjar.jar показывает, что они действительно есть. Насколько я знаю, мне не нужно создавать файл Manifest, потому что я предоставляю класс, из которого я хочу запустить основную функцию во время выполнения - или я здесь не прав?

Помощь очень ценится!

Ответы [ 2 ]

0 голосов
/ 27 июня 2010

Прежде всего, обратите внимание, что если вы просто сделаете

javac org/project/SomeClass.java

, файл класса окажется прямо рядом с файлом .java, что затрудняет включение в jar-файл только .class-файлов.Я предлагаю вам использовать опцию -d, чтобы указать каталог назначения:

javac -d bin org/project/SomeClass.java

Посмотрите на следующую сессию bash для деталей, чтобы она заработала:

Список источникаdirectory:

user@host:/working_dir/src$ ls -R
.:
org

./org:
projectname

./org/projectname:
SomeClass.java

Файл SomeClass.java:

user@host:/working_dir/src$ cat org/projectname/SomeClass.java 
package org.project;

public class SomeClass {
    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

Скомпилируйте его (с целевым каталогом ../bin)

user@host:/working_dir/src$ javac org/projectname/SomeClass.java -d ../bin

Выведите список иУбедитесь, что вы правильно выбрали каталоги:

user@host:/working_dir/src$ cd ../bin/
user@host:/working_dir/bin$ ls -R
.:
org

./org:
project

./org/project:
SomeClass.class

Создайте файл jar:

user@host:/working_dir/bin$ jar cf myjar.jar org

Убедитесь, что вы правильно выбрали каталоги и случайно не включили каталог "bin":

user@host:/working_dir/bin$ jar tf myjar.jar 
META-INF/
META-INF/MANIFEST.MF
org/
org/project/
org/project/SomeClass.class

Запустите основной метод:

user@host:/working_dir/bin$ java -cp myjar.jar org.project.SomeClass 
Hello World

user@host:/working_dir/bin$ 
0 голосов
/ 26 июня 2010

Если разбитый jar org / project / SomeClass ниже вашего текущего рабочего каталога:

/  <- you are here
+---/org
    |
    +-----/project
          |
          +--------SomeClass.class

попробуйте java -cp. вместо org.project.SomeClass

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...