Ошибка NoClassDefFound для фляги, созданной, используя сборку муравья - PullRequest
1 голос
/ 26 ноября 2011

У меня есть проект Java с классом, имеющим метод main в пакете com.nik.mypackage. Ссылка только на одну библиотеку это someLib-5.0.2.jar

Эта библиотека находится в папке lib в eclipse и добавлена ​​в путь сборки.

Я создаю исполняемый jar-файл приложения, используя указанную ниже цель для скрипта ant:

 <property name="src" location="src"/>
 <property name="build" location="build"/>
 <property name="dist"  location="dist"/>

   <target name="init">
      <tstamp/>
      <mkdir dir="${build}"/>
   </target>


 <target name="compile" depends="init"
    description="compile the source " >
       <javac srcdir="${src}" destdir="${build}">
       <classpath>
         <pathelement path="${classpath}"/>
              <pathelement location="lib/someLib-5.0.2.jar"/>
        </classpath>
       </javac>
   </target>

<target name="dist" depends="compile" description="generate the distribution" >
   <!-- Create the distribution directory -->
   <mkdir dir="${dist}/lib"/>
<copy todir="${build}/lib" verbose="true" file="lib/someLib-5.0.2.jar" />

       <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
       <jar jarfile="${dist}/lib/myProject-${DSTAMP}.jar" basedir="${build}">

       <manifest>
            <attribute name="Main-Class" value="com.nik.mypackage.MainClass"/>
            <attribute name="Class-Path" value="../lib/someLib.jar"/>
       </manifest>
</jar>
</target>

Создается jar MyProject-20111126.jar. Однако, запустив следующую команду:

c:>java -jar MyProject-20111126.jar

выбрасывает NoClassDefFoundError для класса в someLib.jar

Что я делаю не так ??

Спасибо за чтение!

Ответы [ 2 ]

1 голос
/ 26 ноября 2011

Когда вы запускаете, где находится someLib.jar относительно MyProject-20111126.jar?

Путь к классу, который вы настраиваете в MyProject.jar, говорит виртуальной машине искать папку lib в родительском каталоге MyProject.jar.

Запись ClassPath в манифесте интерпретируется относительно местоположения файла JAR. Он используется для поиска файлов JAR в файловой системе. Обычный загрузчик классов в JAVA не поддерживает файлы JAR, связанные внутри файлов JAR.

0 голосов
/ 05 декабря 2011

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

...