2013-09-05 3 views
0

Я создал исполняемый файл jar, используя build.Невозможно выполнить файл jar. Получение NoClassDefFoundError

<target name="deploy" depends="compile"> 
<jar jarfile="${deploy.home}/${app.name}.jar" basedir="${build.home}"> 
<manifest> 
<attribute name="Main-Class" value="abc.xyz"/> 
</manifest> 
</jar> 

Здесь вызов хуг имеет основной метод для выполнения всей программы ..

public static void main(String[] args) { 
     File buildFile = new File("build.xml"); 
     Project p = new Project(); 
     p.setUserProperty("ant.file", buildFile.getAbsolutePath()); 
     p.init(); 
     ProjectHelper helper = ProjectHelper.getProjectHelper(); 
     p.addReference("ant.projectHelper", helper); 
     helper.parse(p, buildFile); 
     p.executeTarget(p.getDefaultTarget()); 
} 

Сосуд файл создается успешно. Когда я исполняю как java -jar appname.jar, он бросает исключение -

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/tools/ant/Project 
     at abc.xyz.main(xyz.java:20) 
Caused by: java.lang.ClassNotFoundException: org.apache.tools.ant.Project 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
     at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 

Класс проекта не найден. Его там в ant.jar.

Но когда я выполняю класс abc.java, просто в командной строке java abc работает нормально.

Приятно помочь мне получить причину? и его решение.

+1

не могли бы вы объяснить? Но когда я выполняю класс xyz.java, просто в командной строке java abc.java работает нормально, у вас есть два класса? один призвал друг друга? вы можете опубликовать весь код двух классов (исключая неинтересные части). Мне нужно проверить ваше объявление пакета. – Gianmarco

+1

. Вам нужно добавить необходимые библиотеки в класс-путь, объявленный в манифесте вашего приложения. Если ваше приложение нуждается в ant.jar, вы должны сказать об этом Java. – Holger

+0

Спасибо, Gianmarco, Это была ошибка типографии, я отредактировал ее, только один основной класс. Нет проблемы с пакетом. его рабочий тон на затмении. – smriti

ответ

0

Добавить требуемые библиотеки к пути к классам кувшина

<target name="deploy" depends="compile"> 
<jar jarfile="${deploy.home}/${app.name}.jar" basedir="${build.home}"> 
<manifest> 
<attribute name="Main-Class" value="abc.xyz"/> 
<attribute name="Class-Path" value="ant.jar"/> 
</manifest> 
</jar> 

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

+0

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

+0

Holger-So Nice из вас. Но извините, что он мне не помогает. Еще одна ошибка. Но в файле манифеста я вижу, что классы добавляются относительно. Мне нужно включить папку lib в app.jar? Спасибо за помощь. – smriti

+0

Нет ссылок на библиотеки, которые должны быть * относительно * app.jar не внутри него. – Holger

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