Должен ли файл jar помещаться в lib / ext вместо использования CLASSPATH в Windows XP? - PullRequest
1 голос
/ 08 января 2012

У меня есть два файла jar: A.jar и B.jar. A содержит мою основную функцию и использует классы, определенные в B.

Я помещаю A и B в одну и ту же папку, которая находится в ПУТИ Windows, и пытаюсь запустить мой основной файл в A ...

java -jar A.jar -dosomething

Это дает мне ошибку java.lang.NoClassDefFound в методе B, который я вызываю в коде под -dosomething. Интересно, что он нашел A.jar и вызвал метод main, но не может найти B.jar, даже если он находится в той же папке, что и A.jar.

Итак, я прочитал (снова) о CLASSPATH и переменной JAVA_HOME, и я убедился, что мой JAVA_HOME указывает на правильное место. В этом документе описывается, как я должен иметь возможность поместить файлы расширений jar (в моем случае B) в папку / lib / ext, поэтому я попытался, но получаю то же самое java.lang.NoClassDefFound ошибка.

Я использую Java jdk1.5.0_10, поэтому я также поместил B.jar в папку jre / lib / ext внизу.

Так что теперь у меня есть это в трех местах, локальной папке в PATH, JAVA_HOME / lib / ext и JAVA_HOME / jre / lib / ext, и я все еще получаю ту же ошибку.

Должно ли работать lib / ext? Где я могу положить файл B.jar, чтобы он работал правильно?

Ответы [ 5 ]

3 голосов
/ 08 января 2012

JAVA_HOME не является переменной среды, используемой Java. Он используется другими инструментами, такими как Ant, но не Java.

Переменная окружения PATH также не используется Java. Он используется для поиска исполняемых файлов в Windows, но Java не использует его для поиска jar-файлов.

Помещение двух jar-файлов в один каталог не делает их автоматически в одном и том же пути к классам. Если A.jar является исполняемым файлом jar (как кажется) и зависит от внешнего B.jar, то его запись Class-Path его манифеста должна ссылаться на B.jar. Читать http://docs.oracle.com/javase/tutorial/deployment/jar/downman.html

2 голосов
/ 08 января 2012

Вам необходимо добавить файл манифеста в файл A.jar следующим образом.

Содержимое файла манифеста должно выглядеть следующим образом, где Main-Class указывает на имя вашего пакета и имя классавашего основного класса в A.

Сохраните это в файле с именем что-то вроде Manifest.mf

Manifest-Version: 1.0
Main-Class: com.your.package.name.A
Class-Path: A.jar B.jar

Вы можете вручную добавить этот файл в свой jar, изменив файл .jar наЗатем откройте его .zip и измените содержимое существующего файла манифеста, если таковой имеется, или скопируйте файл Manifest.mf в файл jar / zip и измените его обратно на файл .jar.

0 голосов
/ 03 августа 2017

Чтобы создать исполняемый файл jar, необходимо добавить файл манифеста, который содержит имя основного класса и другие пути к зависимым классам.

Manifest.txt

Main-class: A
Class-Path: B.jar

Добавить этот манифестфайл в A.jar

cmd:/folderLocation>jar cvfm A.jar manifest.txt A.class

поместите оба jar-файла в одну папку и запустите A.jar, используя cmd java -jar A.jar

0 голосов
/ 08 января 2012

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

Я бы сделал Hello World на примере Maven.Большинство современных IDE (IDEA, Eclipse, NetBeans) могут генерировать проекты из pom.xml.

http://maven.apache.org/guides/getting-started/maven-in-five-minutes.html

0 голосов
/ 08 января 2012

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

...