Проблема командной строки Java с чтением класса из архива JAR - PullRequest
2 голосов
/ 16 ноября 2008

Я пытаюсь запустить инструмент на основе Java, используя синтаксис командной строки, как показано ниже: java -cp archive.jar archiveFolder.theMainClassName.Хотя класс, который я ищу, основной класс, theMainClassName находится в архиве .jar и в archiveFolder, указанном при вводе, я получаю сообщение об ошибке, что мой класс не виден. У кого-нибудь есть идеи по этой проблеме? Заранее спасибо

Ответы [ 5 ]

5 голосов
/ 16 ноября 2008

Вот конкретный пример того, как работает , так что вы можете сравнить свою ситуацию.

Возьми этот код и положи его куда угодно, в файл с именем MainClass.java. (Я предположил, что каталог с именем src будет позже. Обычно, вы, конечно, организуете источник, соответствующий пакету.)

package archiveFolder;

public class MainClass
{
    public static void main(String[] args)
    {
        System.out.println("I'm MainClass");
    }
}

Затем выполните каждую из этих команд:

# Compile the source
javac -d . src/MainClass.java

# Build the jar file
jar cf archive.jar archiveFolder

# Remove the unpackaged binary, to prove it's not being used
rm -rf archiveFolder # Or rmdir /s /q archiveFolder on Windows

# Execute the class
java -cp archive.jar achiveFolder.MainClass

Результат:

I'm MainClass

Как вы строите свой JAR-файл? Код в соответствующей упаковке?

3 голосов
/ 16 ноября 2008

Содержит ли классMainClassName следующую строку пакета вверху:

package archiveFolder

Вам необходимо, чтобы файл класса находился в той же структуре каталогов, что и объявленный пакет. Так что, если у вас было что-то вроде:

org/jc/tests/TestClass.class

его исходный файл должен выглядеть следующим образом:

package org.jc.tests;

public class TestClass {
  public static void main(String[] args) {
    System.out.printf("This is a test class!\n");
  }
}

Затем вы можете использовать следующее для создания файла jar и запуска его из командной строки (при условии, что текущий каталог находится на верхнем уровне, чуть выше org):

$ jar -cf testJar.jar org/jc/tests/*.class
$ java -cp testJar.jar org.jc.tests.TestClass
1 голос
/ 16 ноября 2008

Обычно это происходит, когда зависимый класс (статический член) не найден - например, используя log4j:

public class MyClass {
  private static Logger log = Logger.getLogger("com.example");
}

Причина в том, что инициализация такого статического члена может пониматься как часть загрузки класса - ошибки, приводящие к тому, что класс недоступен (загружаемый), что приводит к описанной вами ошибке.

Статические конструкторы являются еще одной возможной причиной:

public class MyClass {
  static {
     // <b>any</b> error caused here will cause the class to 
     // not be loaded. Demonstrating with stupid typecast.
     Object o = new String();
     Integer i = (Integer) o;
  }
}
1 голос
/ 16 ноября 2008

Возможно с java -jar archive.jar?

Конечно, это предполагает, что манифест указывает на правильный класс ...

Вы должны дать точное сообщение, которое вы получили, оно может пролить больше света.

РЕДАКТИРОВАТЬ: См. Работа с файлами манифеста: Основы для получения информации о настройке точки входа приложения (основной класс) в файле манифеста jar.

0 голосов
/ 16 ноября 2008

Я думаю, что другие рассказали о некоторых общих вещах здесь. Я бы набрал банку и убедился, что класс указан в списке. Я также дважды проверил бы, что класс является общедоступным, а метод - "public static void main (String [] arg)".

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