Проблемы с командной строкой Java при чтении класса из архива Jar

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

Выполните команду jar tf <your.jar> и опубликуйте результат. Вырежьте и вставьте точную командную строку, которую вы используете, и точное сообщение об ошибке, выводимое командой java.

erickson 16.11.2008 01:22
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
4 769
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

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

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

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

Обновлено: см. Работа с файлами манифеста: основы для получения информации о настройке точки входа приложения (основной класс) в вашем файле манифеста jar.

На самом деле это не отвечает на вопрос ... он пытается запустить не банку, а определенный класс в банке. Почти наверняка это проблема упаковки.

Jason Coco 16.11.2008 01:31

Я согласен с тем, что это не отвечает на конкретный заданный вопрос, но другие люди, которые ищут SO, могут страдать от проблемы с их манифестом. Они столкнутся с этим вопросом, поэтому я думаю, что здесь стоит ответить на него.

Bill the Lizard 16.11.2008 01:39

Имеет ли класс 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)».

Другие вопросы по теме