создать 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

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

Манифест не допускает абсолютных путей в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
Решение Вопроса

Наконец, я скопировал все библиотеки в папку / 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>

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


*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 для сборки своего приложения, но основная идея заключается в.

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