создать jar с пользовательским манифестом с несколькими библиотеками в classpath

Я пытаюсь создать jar из моего затмения, и чтобы иметь возможность использовать внешние .jars, я использую этот манифест с несколькими .jars в classpath:

Manifest-Version: 1.0
Sealed: true
Main-Class: src.BatchTester
Class-Path: . P:/Tools/xstream/1.4.2/lib/kxml2-2.3.0.jar P:/Tools/xstream/1.4.2/lib/xstream-1.4.2.jar P:/Tools/StringTemplate/4.0.5/lib/antlr-3.3-complete.jar P:/Tools/StringTemplate/4.0.5/lib/ST-4.0.5.jar P:/Tools/Jdbc/lib/sqljdbc4.jar

Очевидно, что если я не помещу библиотеки в путь к классам, появится следующая ошибка:

java.lang.NoClassDefFoundError: com/thoughtworks/xstream/XStream

Но когда я помещаю их в путь к классу, ошибка меняется на:

java.lang.NoClassDefFoundError: src/BatchTester

Таким образом, кажется, что он не может найти мой основной класс. Я пробовал использовать несколько возможностей в classpath, таких как добавление или удаление. к пути к классам, но не могу заставить его работать.

Любая идея, как я могу решить это ???

Спасибо за ваше время и усилия,

PS: после создания .jar путь к классам в манифесте внутри выглядит так:

Class-Path: . P:/Tools/xstream/1.4.2/lib/kxml2-2.3.0.jar P:/Tools/xstr
 eam/1.4.2/lib/xstream-1.4.2.jar P:/Tools/StringTemplate/4.0.5/lib/ant
 lr-3.3-complete.jar P:/Tools/StringTemplate/4.0.5/lib/ST-4.0.5.jar P:
 /Tools/Jdbc/lib/sqljdbc4.jar 

с новыми строками и пробелами, но даже после изменения на «право» формат у меня такие же проблемы.

PS2: я знаю, что с некоторыми плагинами, такими как Fat-Jar, вы можете заставить его работать, но я не хочу вставлять больше данных, чем необходимо, в мой .jar

 magodiez07 июн. 2012 г., 12:59
да, мой BatchTester находится в пакете src ... Я попробовал ваше решение, и та же проблема ... :(
 magodiez07 июн. 2012 г., 12:22
Очевидно, мой класс там ... В противном случае у меня не было бы другой ошибки, когда не определен путь к классу.
 brimborium07 июн. 2012 г., 12:48
Ах, теперь я вижу вашу проблему. Как насчетMain-Class: BatchTester а такжеClass-Path: src P:/Too...? Или ваш BatchTester фактически находится в пакете & quot; src & quot; (это было бы странно)?
 brimborium07 июн. 2012 г., 12:21
Вы проверили, есть ли у вас папка & quot; src & quot; в корне вашей банки, содержащей ваш BatchTester.class?

Ответы на вопрос(3)

Решение Вопроса

Наконец, я скопировал все библиотеки в папку / lib и добавил их в .jar с целью ant, поскольку с ИТ-специалистами все в порядке (потому что это небольшое приложение).

Вот муравей (на случай, если он кому-нибудь пригодится):

<?xml version="1.0" encoding="UTF-8"?>
<project name="BatchTester" default="compile" basedir=".">
    <property name="external" value="lib/external-libs.jar"/>
    <target name="compile">
        <javac srcdir="jav"
               source="1.6"
        />
        <echo>Creating jar File</echo>
        <!--create a new .jar with all the external jars in /lib-->
        <jar jarfile="${external}">
            <zipgroupfileset dir="lib/">
                <include name="**/*.jar"/>
            </zipgroupfileset>
        </jar>
        <!--<sleep seconds="1"/>-->
        <!--create .jar file-->
        <jar jarfile="BatchTester.jar" index="true" filesetmanifest="mergewithoutmain">
            <fileset dir=".">
                <include name="**/jav/**/*.class"/>
                <exclude name="**/jav/**/*.java"/>
            </fileset>
            <zipfileset src="${external}">
                <exclude name="META-INF/*.SF"/>
            </zipfileset>
            <manifest>
                <attribute name="Main-Class" value="jav.BatchTester"/>
            </manifest>
        </jar>
        <!--delete previously created extern .jar-->
        <delete file="${external}"/>
    </target>
</project>
 09 дек. 2015 г., 02:33
Спасибо вам большое! Я потратил часы на решение этой проблемы, пытаясь добавить несколько jar-файлов в путь к классам в манифесте, но это решение с набором zipfileset работает без нареканий и так быстро !!!!!!!
 09 дек. 2015 г., 02:33
Если бы я мог +1 больше, чем один раз, я бы определенно сделал это.

Манифест не допускает абсолютных путей вClass-Path: тег. У вас есть две альтернативы:

Use relative paths as you already mention in your own answer

Use absolute paths via file protocol. This has been answered elsewhere too and it works absolute versus relative path names in jar manifest

Class-Path: file:///P:/Tools/xstream/1.4.2/lib/kxml2-2.3.0.jar

Кроме того, вы не должны редактировать manifest.mf вручную, не зная о нескольких ограничениях:

line maximum length must not exceed 72 characters, and after breaking one line you must insert an space in the first column. There must be a carriage return after the last line otherwise, the file can't be parsed correctly

Извините, если мои вопросы звучат для вас очевидно.

*Launch Command *

Чтобы исключить какие-либо сомнения, не пытались ли вы запустить свою банку с помощью такой команды?

java -jar myJar.jar -cp ./lib

Если вы используете параметр classpath, вы, вероятно, этого не сделали. Опция --classpath (или -cp) и -jar не могут использоваться вместе.

Предпочитаю также использовать относительный путь, например ./lib вместо P: / Tools / ... Но, в любом случае, это не решит вашу проблему.

*Package Location *

Как сказал Бримбориум, какая у тебя настоящая посылка? SRC звучит очень странно. Мы подозреваем ошибку вокруг этого.

Что вы написали в классе BatchTester для директивы пакета? Ничего (то есть пакет по умолчанию, который не рекомендуется?)?

Вы начинаете занятия (избавьтесь от комментариев)

public class BatchTester {

В этом случае, безусловно, не следует упоминать src.

Вот пример манифеста, который работает для меня.

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: jrRevy
Build-Jdk: 1.6.0_31
Main-Class: com.sopragroup.training.dojo1.MainSwingApp
Class-Path: dojo1-0.5.0-SNAPSHOT-lib/spring-core-3.1.1.RELEASE.jar doj
 o1-0.5.0-SNAPSHOT-lib/spring-asm-3.1.1.RELEASE.jar [blablabla]

со следующей структурой исполнения

/
|
+ --dojo1-0.5.0-SNAPSHOT.jar
|
+ --dojo1-0.5.0-SNAPSHOT-lib/
    |
    + --spring-core-3.1.1.RELEASE.jar

Очевидно, я использую maven для сборки своего приложения, но основная идея заключается в.

Ваш ответ на вопрос