web-dev-qa-db-ja.com

Netbeansプロジェクトに外部jarを含めるにはどうすればよいですか

「クリーンアンドビルド」を実行すると、libフォルダーが.jarファイルと同じフォルダーにある場合にのみ、作成される.jarファイルが実行されます。

そのため、jarファイルをデスクトップに移動し、libフォルダーをdistフォルダーに残したままにしておくと、jarファイルで例外が発生します。

この問題にどのように対処できますか?

23
ksm001

Jarファイルをソースコードディレクトリにコピーすると、最終的なjarファイルになります。それでも、これが100%の時間で機能するかどうかはわかりません。

Java-forum には、次のようなすばらしい投稿があります。

いくつかの状況を除いて、私にとって最適なのは、ファイルを手動でマージすることです。 .jarは基本的に整理されたコンテンツを持つ.Zipであり、ほとんどすべての.Zip対応のアーカイブプログラムで開くことができます(私はgnomeの標準アーカイバであるFile Rollerを使用していますが、うまく機能します)。 jarファイルをバックアップして、選択したアーカイバで開き、ライブラリディレクトリ内の各ライブラリjarに対して同じことを行います。作業フォルダ(IE、META-INFディレクトリを除くすべて)を各ライブラリからjarのルートパス(META-INFおよびアプリのルートパッケージと一緒に)にドラッグアンドドロップします。次に、META-INF/MANIFEST.MFファイルをjarからデスクトップまたはその他のフォルダーにドラッグします。それを開き、クラスパスとX-COMMENT行を消去します。ファイルの最後に空白の改行を残すことを忘れないでください!新しいマニフェストファイルを保存し、jarのMETA-INFディレクトリにドラッグして戻し、古いファイルを上書きします。 jarをテストします。

13
rlinden

NetBeansのbuild.xmlファイルに次を追加して、すべてのライブラリを含む1つのjarファイルを作成することでこれを解決しました。

<target name="-post-jar">
  <jar jarfile="dist/Combined-dist.jar">
    <zipfileset src="${dist.jar}" excludes="META-INF/*" />
    <zipfileset src="lib/commons-io-1.4.jar" excludes="META-INF/*" />
    <zipfileset src="lib/ninja-utils-3.2.jar" excludes="META-INF/*" />
    <zipfileset src="lib/Unicorn-1.0.jar" excludes="META-INF/*" />
    <manifest>
        <attribute name="Main-Class" value="com.example.mypackage.Main"/>
    </manifest>
  </jar>
</target>

これにより、dist jarと指定されたライブラリjar(この場合、commons-io-1.4.jar、ninja-utils-3.2.jar、およびUnicorn-1.0)の組み合わせであるjarファイル(Combined-dist.jar)が作成されます。 jar)。新しいjarファイルのメインクラスパッケージを指定する必要があります。そうしないと、開こうとしても実行されません。

23
Hemerson Varela

すべての依存ライブラリ(* .jar)を1つのmyProject.jarにパッケージ化するのは本当に簡単です。

これらの手順に従うだけで、最終的にすべての依存ライブラリを単一のjarにパックします。 NetBeansを使用している場合は、プロジェクトファイルでbuild.xmlファイルを見つける必要があります。

build.xmlを編集するには、次の手順に従います

1)NetBeansのプロジェクトパネルの左側にあるFiles tabをクリックします。

2)build.xmlファイルをダブルクリックし、</project>行の直前にこれらの行を追加します

 <target name="package-for-store" depends="jar">
    <property name="store.jar.name" value="myProject"/>
    <property name="store.dir" value="store"/>
    <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>
    <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>
    <delete dir="${store.dir}"/>
    <mkdir dir="${store.dir}"/>
    <jar destfile="${store.dir}/temp_final.jar" filesetmanifest="skip">
        <zipgroupfileset dir="dist" includes="*.jar"/>
        <zipgroupfileset dir="dist/lib" includes="*.jar"/>
        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>
    <Zip destfile="${store.jar}">
        <zipfileset src="${store.dir}/temp_final.jar"
        excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
    </Zip>
    <delete file="${store.dir}/temp_final.jar"/>
</target>

3)プロジェクト名ごとに、コードの2行目のvalueを変更します。

<property name="store.jar.name" value="myProject"/> //<---Just value not name

4)保存して、build.xmlを右クリックし、ターゲットの実行を選択してからその他のターゲットを選択し、最後にパッケージ- for-store

5)これで完了です。これで、distフォルダーのように確認して、すべての依存ライブラリを含む最終的な完全なjarを含むstoreフォルダーができます。ライブラリを変更または追加する場合などは、手順4に従ってください。

ステップ4の画像

enter image description here

7

バージョン1.7以降のApache Antを使用して、必要なライブラリを1つのファイルにまとめてJARをビルドできます。次のような構成ファイルを作成できます。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project default="buildJar">
    <target name="buildJar">
        <!-- Name of jar -->
        <jar destfile="C:/MyJar.jar" filesetmanifest="mergewithoutmain">
            <manifest>
                <!-- Your class with the main method -->
                <attribute name="Main-Class" value="myPackage.MyClass"/>
                <!-- Path in the jar -->
                <attribute name="Class-Path" value="."/>
            </manifest>
            <!-- Dir of compiled class -->
            <fileset dir="C:/NetBeansProjects/MyProject/bin"/>
            <!-- Include required jars -->
            <zipfileset excludes="META-INF/*.SF" 
                src="C:/NetBeansProjects/MyProject/lib/library1.jar"/>
            <zipfileset excludes="META-INF/*.SF" 
                src="C:/NetBeansProjects/MyProject/lib/library2.jar"/>
        </jar>
    </target>
</project>

Netbeansで、プロジェクトにXMLファイルを配置し、コンテキストメニューで実行します。

詳細は Apache Antユーザーマニュアル をご覧ください。

5
Paul Vargas

アプリを別のPCに配布する場合

Libフォルダと一緒に.jarを圧縮するだけです。

PCの任意の場所からアプリを実行する場合

これを行うMavenの方法を考慮してください。たとえば、ローカルリポジトリを作成します。ライブラリが存在し、.jarが後でPCの任意の場所からライブラリにアクセスできるC:\ libs。

または、Mavenを使用することもできます。すべての依存関係(ライブラリ)でアプリケーションを配布することについての議論があります: Java:Mavenベースのプロジェクトのスタンドアロン配布をビルドするにはどうすればよいですか? .

3
JMelnik

そのjarファイルを次の場所にコピーします。

C:\ Program Files\Java\jdk\jre\lib\ext

そして

C:\ Program Files\Java\jre\lib\ext

標準のインポートと同様に、Netbeansおよび手動インポートで使用できるはずです。

3
Thiyagarajan

この問題の最も簡単な解決策を見つけたかもしれません here 。次のコードスニペットをプロジェクトフォルダーのbuild.xmlファイルの最後にコピーするだけです。

<target name="-post-jar">

    <!-- Change the value to the name of the final jar without .jar -->
    <property name="store.jar.name" value="MyJarName"/>

    <!-- don't edit below this line -->
    <property name="store.dir" value="dist"/>
    <property name="temp.dir" value="temp"/>
    <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

    <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>

    <delete dir="${temp.dir}"/>
    <mkdir dir="${temp.dir}"/>

    <jar destfile="${temp.dir}/temp_final.jar" filesetmanifest="skip">
        <zipgroupfileset dir="dist" includes="*.jar"/>
        <zipgroupfileset dir="dist/lib" includes="*.jar"/>

        <manifest>
            <attribute name="Main-Class" value="${main.class}"/>
        </manifest>
    </jar>

    <delete dir="${store.dir}"/>

    <Zip destfile="${store.jar}">
        <zipfileset src="${temp.dir}/temp_final.jar"
        excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
    </Zip>

    <delete dir="${temp.dir}"/>

</target>
  1. プロジェクトのルートにあるbuild.xmlに移動し、最後の</project>タグの直前にコードを追加します。

  2. ここで、最初のプロパティフィールドの値をコメントとして変更し、変更を保存します。

  3. これ以降、プロジェクトをクリーン&ビルドするたびに、依存関係を含む完全なjarがプロジェクトのdistフォルダーに生成されます

2
Deniz Celebi

user1016588のソリューションは私のために機能します。タイプミスが1つあります。この行はzipfileset src = "dist/lib/commons-io-1.4.jar" excludes = "META-INF/*"である必要があります

1
Gang Su

これは私のために働いたものです:

Excelエクスポート機能をプロジェクトに組み込みました。この目的で使用した2つの外部.jarはjxl.jar end sx.jarでした

METAファイルなしで7-Zipを使用して、これら2つのjarをフォルダー(Javaクラス)に解凍します。プロジェクトjarを、METAファイルを含む同じフォルダーに解凍します。

JARMakerを使用してJavaクラスフォルダー全体を再パックして、プロジェクトの.jarを元の配布フォルダーに再作成します...そして、Excelの全機能を使用できます。

1
user2270400

これを試してください-Netbeans IDEで:

  1. [ツール]-> [ライブラリ]に移動します
  2. ダイアログボックスの左下にある[新しいライブラリ]をクリックして、名前を付けます
  3. 右側で、「JAR /フォルダを追加」をクリックします
  4. 右下の[OK]をクリックします
  5. IDEを再起動して確認します。
1
vfredrick

次の手順に従ってください。1. netbeansエディターで開かれたプロジェクトを右クリックします2.プロパティを選択します3.ライブラリを選択します4. jarを追加します5. [OK]をクリックします

0
myskons

NetBeansとant-contribでテストされた、これを使用することもできます(ライブラリが「dist/lib」にない場合)。

    <target name="-post-jar">
                <taskdef resource="net/sf/antcontrib/antlib.xml">
                  <classpath>
                        <!-- Path to ant-contrib -->
                        <pathelement location="../../Libs/ant-contrib-1.0b3.jar"/>
                  </classpath>
                </taskdef>

                <!-- Change the value to the name of the final jar without .jar -->
                <property name="store.jar.name" value="${application.title}"/>

                <!-- don't edit below this line -->
                <property name="store.dir" value="dist"/>
                <property name="temp.dir" value="temp"/>
                <property name="temp.libs.dir" value="temp/libs"/>
                <property name="store.jar" value="${store.dir}/${store.jar.name}.jar"/>

                <echo message="Packaging ${application.title} into a single JAR at ${store.jar}"/>
                
                <fileset id="store.jars.absolute" dir="${store.dir}" includes="*.jar"/>           
                <pathconvert property="store.jars.relative" refid="store.jars.absolute" dirsep="/">
                        <map from="${basedir}/" to=""/>
                </pathconvert>
                
                <for list="${store.jars.relative}" param="item">
                        <sequential>
                                <echo message="Adding @{item} into single JAR at ${store.jar}"/>
                        </sequential>
                </for>

                <delete dir="${temp.dir}"/>
                <mkdir dir="${temp.dir}"/>
                
                <for list="${javac.classpath}" param="item" delimiter=":">
                        <sequential>
                                <echo message="Adding @{item} into single JAR at ${store.jar}"/>
                                <copy file="@{item}" todir="${temp.libs.dir}" overwrite="true" />
                        </sequential>
                </for>

                <jar destfile="${temp.dir}/temp_final.jar" filesetmanifest="skip">
                        <zipgroupfileset dir="${store.dir}" includes="*.jar"/>
                        <zipgroupfileset dir="${temp.libs.dir}" includes="*.*"/>

                        <manifest>
                                <attribute name="Main-Class" value="${main.class}"/>
                        </manifest>
                </jar>

                <delete dir="${store.dir}"/>

                <Zip destfile="${store.jar}">
                        <zipfileset src="${temp.dir}/temp_final.jar" excludes="META-INF/*.SF, META-INF/*.DSA, META-INF/*.RSA"/>
                </Zip>

                <delete dir="${temp.dir}"/>

        </target>
0
user2830808