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




Возможно с java -jar archive.jar?
Конечно, предполагается, что манифест указывает на правильный класс ...
Вы должны дать точное сообщение, которое вы получили, это может пролить больше света.
Обновлено: см. Работа с файлами манифеста: основы для получения информации о настройке точки входа приложения (основной класс) в вашем файле манифеста jar.
На самом деле это не отвечает на вопрос ... он пытается запустить не банку, а определенный класс в банке. Почти наверняка это проблема упаковки.
Я согласен с тем, что это не отвечает на конкретный заданный вопрос, но другие люди, которые ищут SO, могут страдать от проблемы с их манифестом. Они столкнутся с этим вопросом, поэтому я думаю, что здесь стоит ответить на него.
Имеет ли класс 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
Вот конкретный пример работы делает, чтобы вы могли сравнить свою ситуацию.
Возьмите этот код и поместите его где угодно, в файл с именем 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-файл? Находится ли код в соответствующем пакете?
Обычно это происходит, когда зависимый класс (статический член) не найден - вот так, используя 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;
}
}
Я думаю, что другие рассказали здесь о некоторых общих вещах. Я бы встряхнул банку и убедился, что класс указан. Я бы также дважды проверил, является ли класс общедоступным, а метод - «public static void main (String [] arg)».
Выполните команду
jar tf <your.jar>и опубликуйте результат. Вырежьте и вставьте точную командную строку, которую вы используете, и точное сообщение об ошибке, выводимое командой java.