Недопустимый или поврежденный jar-файл

Я попытался создать файл jar из java-проекта, в котором используются некоторые внешние банки. Я создал папку lib и поместил туда все нужные мне банки.

Я запускаю проект в eclipse, добавляя все jar-файлы в папку lib в путь сборки, и он работает нормально.

Когда я пытаюсь создать банку с помощью ant из build.xml, все в порядке, ошибки не отображаются.

Когда я пытаюсь запустить банку, я получаю сообщение «Недопустимый или поврежденный файл jar».

В build.xml: я определяю путь для компиляции:

<path id="project.classpath">  
     <fileset dir="${lib}">
         <include name="**/*.jar"/>
     </fileset>
</path>

Это цель для компиляции:

<target name="compile" depends="init" description="compile the source " >
    <!-- Compile the java code from ${src} into ${build} -->
    <javac srcdir="${src}" destdir="${build}">  
          <classpath refid="project.classpath"/>  
    </javac>  
</target>

И это цель для создания файла jar:

<target name="dist" depends="compile" description="generate the distribution" >
      <mkdir dir="${dist}"/>
      <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file -->
      <jar jarfile="${dist}/MyProject-${DSTAMP}.jar" basedir="${build}"> 
          <manifest>
            <attribute name="Main-Class" value="${main}" />
            <attribute name="Class-Path:" value="lib/**/*.*"/>
          </manifest>
          <fileset dir="${src}" includes="images/**/*.*" />
       </jar>
       <echo file="${dist}/start.bat" message="java -jar MyProject-${DSTAMP}.jar" />
  </target>

Можете ли вы сказать мне, что я сделал неправильно?


person Jenny Smith    schedule 14.06.2009    source источник


Ответы (2)


Сначала удалите двоеточие после Class-Path: для соответствия

<attribute name="Class-Path" value="lib/**/*.*"/>

Тогда предлагаю прочитать

КАК СОЗДАТЬ MANIFEST.MF Classpath From Ant или лучше использовать путь к классу манифеста

person jitter    schedule 14.06.2009
comment
Он работал с манифестом classpath. Проблема действительно заключалась в том, что имена банок были слишком длинными, чем позволяли 72 символа. - person Jenny Smith; 14.06.2009
comment
Строки в MANIFEST.MF можно переносить. Я тоже думаю, что виновником является дополнительное двоеточие. - person Thorbjørn Ravn Andersen; 14.06.2009
comment
+1 для пути к классу манифеста. Не смотрел на новые вкусности с 1.6.2, так что это приятное дополнение. - person Thorbjørn Ravn Andersen; 14.06.2009

Я не думаю, что ваш атрибут Class-Path должен иметь завершающее двоеточие, указанное в вашем build.xml.

Попробуйте использовать

jar tvf {jarname} 

из командной строки и посмотрите, может ли это расширить ваш файл jar и содержит ли он то, что вы ожидаете (приведенное выше просто выводит оглавление, но это полезная проверка)

РЕДАКТИРОВАТЬ: изменено, чтобы отразить обратную связь ниже

person Brian Agnew    schedule 14.06.2009
comment
Я также пробовал эту версию: ‹имя атрибута=Путь к классу: значение=lib/**/*.jar/› И все равно не работает - person Jenny Smith; 14.06.2009
comment
Если вы посмотрите в свой файл манифеста, вы увидите, что это написано. Но действительно ли классы находятся в вашем файле .jar? - person Brian Agnew; 14.06.2009
comment
Я открыл банку, и казалось, что в ней есть все. По крайней мере, все классы и файлы в проекте. Версия манифеста: 1.0 Версия Ant: Apache Ant 1.7.0 Автор: 11.0-b15 (Sun Microsystems Inc.) Основной класс: controller.Client Class-Path:: lib/**/*.jar - person Jenny Smith; 14.06.2009
comment
Да, классы в баночках включены. - person Jenny Smith; 14.06.2009
comment
Обратите внимание на двойное двоеточие в Class-Path - person Brian Agnew; 14.06.2009
comment
Если я не включу путь к классу в файле манифеста, я получу исключение NoClassDeffFoundError - person Jenny Smith; 14.06.2009
comment
Брайан, ты был прав. Холод был проблемой. Теперь я получаю NoClassDefFoundError. Я ищу банку для этого класса, и он там. Я также использую некоторые другие классы в приложении (до того, который создает проблему) из той же банки, и я не получаю никаких исключений. У вас есть идеи, почему это происходит? - person Jenny Smith; 14.06.2009
comment
Возможно, вы захотите проверить, что классы, на которые ссылается В классе, в котором вы получаете ошибку NoClassDefFound, также присутствуют. В противном случае класс не может быть правильно загружен/построен. - person Brian Agnew; 14.06.2009
comment
Они там. Кстати, есть ли проблема, если я использую потоки в этих классах? - person Jenny Smith; 14.06.2009