「クリーンアンドビルド」を実行すると、lib
フォルダーが.jar
ファイルと同じフォルダーにある場合にのみ、作成される.jar
ファイルが実行されます。
そのため、jarファイルをデスクトップに移動し、lib
フォルダーをdist
フォルダーに残したままにしておくと、jarファイルで例外が発生します。
この問題にどのように対処できますか?
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をテストします。
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ファイルのメインクラスパッケージを指定する必要があります。そうしないと、開こうとしても実行されません。
すべての依存ライブラリ(* .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の画像
バージョン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ユーザーマニュアル をご覧ください。
アプリを別のPCに配布する場合
Libフォルダと一緒に.jarを圧縮するだけです。
PCの任意の場所からアプリを実行する場合
これを行うMavenの方法を考慮してください。たとえば、ローカルリポジトリを作成します。ライブラリが存在し、.jarが後でPCの任意の場所からライブラリにアクセスできるC:\ libs。
または、Mavenを使用することもできます。すべての依存関係(ライブラリ)でアプリケーションを配布することについての議論があります: Java:Mavenベースのプロジェクトのスタンドアロン配布をビルドするにはどうすればよいですか? .
そのjarファイルを次の場所にコピーします。
C:\ Program Files\Java\jdk\jre\lib\ext
そして
C:\ Program Files\Java\jre\lib\ext
標準のインポートと同様に、Netbeansおよび手動インポートで使用できるはずです。
この問題の最も簡単な解決策を見つけたかもしれません 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>
プロジェクトのルートにあるbuild.xmlに移動し、最後の</project>
タグの直前にコードを追加します。
ここで、最初のプロパティフィールドの値をコメントとして変更し、変更を保存します。
これ以降、プロジェクトをクリーン&ビルドするたびに、依存関係を含む完全なjarがプロジェクトのdistフォルダーに生成されます
user1016588のソリューションは私のために機能します。タイプミスが1つあります。この行はzipfileset src = "dist/lib/commons-io-1.4.jar" excludes = "META-INF/*"である必要があります
これは私のために働いたものです:
Excelエクスポート機能をプロジェクトに組み込みました。この目的で使用した2つの外部.jarはjxl.jar end sx.jarでした
METAファイルなしで7-Zipを使用して、これら2つのjarをフォルダー(Javaクラス)に解凍します。プロジェクトjarを、METAファイルを含む同じフォルダーに解凍します。
JARMakerを使用してJavaクラスフォルダー全体を再パックして、プロジェクトの.jarを元の配布フォルダーに再作成します...そして、Excelの全機能を使用できます。
これを試してください-Netbeans IDEで:
次の手順に従ってください。1. netbeansエディターで開かれたプロジェクトを右クリックします2.プロパティを選択します3.ライブラリを選択します4. jarを追加します5. [OK]をクリックします
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>