2016-07-22 2 views
0

Я пытаюсь создать безглавую сборку, которая требует особых задач затмения.ANT eclipse headless build - java.lang.NoClassDefFoundError

Для запуска файла сборки муравьев я использую следующую команду. Я делаю это так, потому что считаю, что это позволяет мне запускать задачи eclipse, которые ранее жаловались, что им нужна рабочая область для запуска. Если это неверно/если есть лучший способ, сообщите мне.

Моя партия сценарий:

java -jar %EQUINOX_LAUNCHER_JAR% -application org.eclipse.ant.core.antRunner -buildfile %ANT_SCRIPT_JAR% -data %WORKSPACE_PATH% 

Внутри моего муравья файла построения, мне нужно определить задачу:

<taskdef name="myTask" classname="path.to.class.with.execute"><classpath><pathelement location="path\to\dependency.jar"/></classpath></taskdef> 

При запуске

<myTask/> 

Я получаю

java.lang.NoClassDefFoundError: path/to/class/that/I/tried/to/import 
+0

Единственные возможности что либо путь к .jar неверно, или имя класса неверно. Является ли путь к .jar относительным путем? Если да, то это относительно файла сборки? Вы задаете альтернативный вариант для проекта? Вы дважды проверяли, что .jar содержит класс? – VGR

+0

Все пути абсолютны. Исправьте меня, если я ошибаюсь, но поскольку задача выполняется, но затем получает ошибку, я считаю, что это означает, что мое имя класса настроено правильно. Я не верю, что настроил альтернативный basedir – David

+0

Итак, NoClassDefFoundError не относится к самому классу задач? – VGR

ответ

1

Классы, которые использует код вашей задачи, должны быть в пути к классам. Один из вариантов, чтобы добавить их в явном виде пути к классам при определении задачи:

<taskdef name="myTask" classname="path.to.class.with.execute"> 
    <classpath> 
     <pathelement location="path/to/dependency.jar"/> 
     <pathelement location="path/to/transitive-dependency.jar"/> 
     <pathelement location="path/to/other-transitive-dependency.jar"/> 
    </classpath> 
</taskdef> 

Если все файлы .jar находятся в одном дереве каталогов, вы можете сократить его:

<taskdef name="myTask" classname="path.to.class.with.execute"> 
    <classpath> 
     <fileset dir="path/to/dir" includes="**/*.jar"/> 
    </classpath> 
</taskdef> 

одна возможность заключается в добавлении атрибута Class-Path в манифест .jar, который содержит класс задачи. Значение атрибута - это список разделенных пробелами относительных URL-адресов, причем их подразумеваемая база является файлом .jar, в котором находится манифест. Например:

Class-Path: transitive-dependency.jar utils/other-transitive-dependency.jar 

Если вы создаете задачу .jar себя в Ant, вы можете указать атрибут Class-Path в jar задачи Ant с:

<jar destfile="task.jar"> 
    <fileset dir="classes"/> 
    <manifest> 
     <attribute name="Class-Path" 
      value="transitive-dependency.jar utils/other-transitive-dependency.jar"/> 
    </manifest> 
</jar> 
Смежные вопросы