5

私はEclipseからjarを作成しようとしていますが、外部の.jarを使用できるようにするために、クラスパスに複数の.jarを含むこのマニフェストを使用しています:

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

だから、私のメインクラスが見つからないようです。クラスパスへの追加や削除など、クラスパスでいくつかの可能性を試しましたが、うまくいき.ません。

どうすればこれを解決できますか?

あなたの時間と努力に感謝します,


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 に必要以上のデータを挿入したくありません。

4

3 に答える 3

7

最後に、すべてのライブラリを /lib フォルダーにコピーし、それらを Ant ターゲットを使用して .jar に追加しました。これは、IT スタッフには問題ないように思われるためです (小さなアプリケーションであるため)。

これがアリです(誰かにとって役立つ場合に備えて):

<?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>
于 2012-06-08T13:21:50.410 に答える
3

申し訳ありませんが、私の質問があなたにとって明白に聞こえる場合。


*コマンドを起動します*

疑いを排除するために、この種のコマンドでjarを起動しようとしませんでしたか?

java -jar myJar.jar -cp ./lib

クラスパスオプションを使用する場合は、おそらく使用しませんでした;)。オプション--classpath(または-cp)と-jarを一緒に使用することはできません。

P:/ Tools /...の代わりに./libのように、相対パスも使用することをお勧めします。ただし、とにかく、それでは問題は解決しません。


*パッケージの場所*

ブリンボリウムが言ったように、あなたは本当のパッケージは何ですか?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を使用していますが、主なアイデアはにあります。

于 2012-06-08T12:19:58.017 に答える