2

休止状態を利用するプロジェクトの実行可能な jar ファイルをコンパイルしようとしています。ビルド プロセスを合理化するために ant build.xml ファイルを作成しようとしていますが、最終的な jar ファイル内に hibernate3.jar を含めることに問題があります。

Ant スクリプトを実行すると、すべてのライブラリ jar を含めることができ、最終的な jar ファイルのルートに配置されます。jarファイルを実行すると、

java.lang.NoClassDefFoundError: org/hibernate/Session 

エラー。Eclipse で組み込みの jar へのエクスポートを使用すると、「必要なライブラリを jar に抽出する」を選択した場合にのみ機能します。しかし、それは jar を肥大化させ、私のプロジェクト (つまり、単体テスト) が多すぎます。

以下は私の生成されたマニフェストです:

Manifest-Version: 1.0
Main-Class: main.ServerImpl
Class-Path: ./ antlr-2.7.6.jar commons-collections-3.1.jar dom4j-1.6.1.jar
hibernate3.jar javassist-3.9.0.GA.jar jta-1.1.jar slf4j-api-1.5.11.jar 
slf4j-simple-1.5.11.jar mysql-connector-java-5.1.12-bin.jar rmiio-2.0.2.jar 
commons-logging-1.1.1.jar

build.xml の一部は次のようになります。

<target name="dist" depends="compile" description="Generates the Distribution Jar(s)">
    <mkdir dir="${dist.dir}" />
    <jar destfile="${dist.dir}/${dist.file.name}.jar" basedir="${build.prod.dir}" filesetmanifest="mergewithoutmain">
        <manifest>
            <attribute name="Main-Class" value="${main.class}" />
            <attribute name="Class-Path" value="./ ${manifest.classpath} " />
            <attribute name="Implementation-Title" value="${app.name}" />
            <attribute name="Implementation-Version" value="${app.version}" />
            <attribute name="Implementation-Vendor" value="${app.vendor}" />
        </manifest>
        <zipfileset refid="hibernatefiles" />
        <zipfileset refid="slf4jfiles" />
        <zipfileset refid="mysqlfiles" />
        <zipfileset refid="commonsloggingfiles" />
        <zipfileset refid="rmiiofiles" />
    </jar>
</target>

zipfilesets の refid は、プロジェクトのルートにあるライブラリ ディレクトリ lib 内のディレクトリを指します。manifest.classpath-variable は、これらすべてのライブラリ jar ファイルのクラスパスを取得し、pathconvert とマッパーでそれらをフラット化します。

また、マニフェスト クラスパスを「.」、「./」、およびライブラリ jar のみに設定しようとしましたが、まったく違いはありません。私の問題に対する簡単な解決策があることを願っています...

4

1 に答える 1

2

クラスパスに jar-inside-jar を指定できないため、この方法は機能しません。次のように、コードのみを jar してから、jar を libs jar と起動スクリプトで圧縮する必要があります。

#!/bin/sh
java -cp ./hibernate.jar:./mycode.jar... my.Main

(これはほとんどの人が行うことです)、またはすべてのlib jarをコンパイル済みのクラスを含む同じディレクトリに解凍し、jar結果ディレクトリを単一のjarファイルに戻すことができます(これはmaven jar-with-dependenciesパッケージングが行うことです)。

于 2010-04-22T11:31:55.987 に答える