2008-11-15 2 views
2

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

+0

Запустите команду `jar tf ` и опубликуйте результат. Вырезать и вставить точную командную строку, которую вы используете, и точное сообщение об ошибке, выводимое командой java. – erickson 2008-11-15 22:22:13

ответ

5

Вот конкретный пример того, что делает работы, так что вы можете сравнить свои собственные си tuation.

Возьмите этот код и поместите его в любом месте в файле с именем 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? Является ли код в соответствующем пакете?

1

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

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

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

EDIT: см. Working with Manifest Files: The Basics для получения информации о настройке точки входа приложения (основной класс) в файле манифеста jar.

+0

Это на самом деле не отвечает на вопрос ... он не пытается запустить банку, а конкретный класс в банке. Это почти наверняка проблема упаковки. – 2008-11-15 22:31:39

3

ли theMainClassName класс имеет следующий пакет линию: в верхней части

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 файл и запустить его из командной строки (предполагая, что текущий каталог находится на верхнем уровне, чуть выше орга):

$ jar -cf testJar.jar org/jc/tests/*.class 
$ java -cp testJar.jar org.jc.tests.TestClass 
1

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

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

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

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

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; 
    } 
} 
0

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

Смежные вопросы