NoClassDefFound при попытке запустить Java с внешними библиотеками - PullRequest
2 голосов
/ 30 марта 2011

У меня проблема с запуском моего Java-проекта.

E:\Workspace\compiled>java -classpath server\libraries\log4j-1.2.16.jar;E:\Workspace\compiled\server\service-1.0-SNAPSHOT.jar;E:\Workspace\compiled\server\libraries\log4j-1.2.16.jar -Djava.security.policy=E:\Workspace\compiled\socket.policy -Djava.rmi.server.codebase=file:///E:\Workspace\compiled\server\service-1.0-SNAPSHOT.jar -jar E:\Workspace\compiled\server\service-1.0-SNAPSHOT.jar E:\Workspace\compiled\log4j.properties
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/PropertyConfigurator
    at pwr.mgr.server.service.Launcher.main(Launcher.java:18)
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.PropertyConfigurator
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    ... 1 more

Он скомпилирован с использованием maven, и я получаю файл .jar. Сегодня я решил, что я буду использовать log4j для регистрации вместо wimple System.out ... До этого изменения все работало нормально

вот как я запускаю

java -cp .;%SRV_ADDR%;%SRV_LIBS% -Djava.security.policy=%POLICY_FILE% -Djava.rmi.server.codebase=file:///%SRV_ADDR% pwr.mgr.server.service.Launcher %CD%\log4j.properties

SRV_ADDR указывает на мой файл service.jar (с классом запуска)

SRV_LIBS указывает на log4j-1.2.16.jar

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

Я должен также упомянуть, что мне нужно где-то здесь найти библиотеку log4j, потому что я перенесу свое приложение на другую машину, и я не знаю, какие библиотеки ожидать там, может быть, только на чистой Java, поэтому мне нужно доставить все в одной упаковке.

Если кто-то заинтересован в классе Launcher, это очень просто:

public class Launcher {

public static void main(String args[]) {
    PropertyConfigurator.configure(args[0]);
    if (System.getSecurityManager() == null) {
        System.setSecurityManager(new SecurityManager());
    }

    try {
        Runtime.getRuntime().exec("rmiregistry");
        ServerIntf obj = new Server();
        Registry registry = LocateRegistry.getRegistry();
        registry.rebind("Server", obj);
        System.out.println("Server bound in registry");
    } catch (Exception e) {
        System.out.println("Server err: " + e.getMessage());
        e.printStackTrace();
    }
}
}

Кто-нибудь знает, что я делаю не так? Может быть, недостаточно добавить только один файл jar log4j? Я скопировал его из моего хранилища Maven.

EDIT1 уже изменил jar, на который я указываю с log4j-1.2.16-javadoc.jar на log4j-1.2.16.jar, но это не помогло

Ответы [ 4 ]

3 голосов
/ 31 марта 2011

При использовании java -jar ..., аргумент -classpath игнорируется . Либо укажите все необходимые файлы jar в манифесте вашего основного файла jar (но вы можете использовать только относительные пути там), либо добавьте свой основной файл jar в -classpath и укажите основной класс в командной строке.

Да, мне это тоже не нравится.

1 голос
/ 30 марта 2011

Похоже, что вы указываете на неправильную банку log4j.

У вас сейчас есть -classpath server\libraries\log4j-1.2.16-javadoc.jar; который пытается загрузить файл javadoc jar.

Попробуйте использовать -classpath server\libraries\log4j-1.2.16.jar;.

1 голос
/ 30 марта 2011

SRV_LIBS указывает на log4j-1.2.16-javadoc.jar

Обычно "-javadoc" в имени означает, что в jar нет кода - только документация javadoc. Вместо этого попробуйте log4j-1.2.16.jar.

0 голосов
/ 30 марта 2011

Для начала вы используете javadoc jar log4j.Он содержит только документацию Javadoc, а не файлы классов.Вы должны использовать log4j-1.2.16.jar.

...