「クリーンアンドビルド」を実行すると、作成中のファイルは、フォルダーがファイルと同じフォルダーにある.jar
場合にのみ実行されます。lib
.jar
そのため、jar ファイルをデスクトップに移動し、lib
フォルダーをフォルダーに残すdist
と、jar ファイルで例外が発生します。
どうすればこの問題に対処できますか?
これを解決するには、すべてのライブラリを含む jar ファイルを 1 つだけ作成し、NetBeans の build.xml ファイルに次を追加します。
<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) を組み合わせた jar ファイル (Combined-dist.jar) が作成されます。ジャー)。新しい 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 からデスクトップまたはその他のフォルダーにドラッグします。それを開き、Class-Path と X-COMMENT の行を消去します。ファイルの最後に空白の改行を残すことを忘れないでください! 新しいマニフェスト ファイルを保存し、jar の META-INF ディレクトリにドラッグして戻し、古いものを上書きします。瓶をテストします。
バージョン 1.7 以降の Apache Ant を使用して、必要なライブラリを含む JAR を 1 つのファイルだけでビルドできます。次のような構成ファイルを作成できます。
<?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 User Manualを参照してください。
アプリを別の PC に配布する場合
libフォルダーと一緒に.jarを圧縮するだけです。
PC のどこからでもアプリを実行したい場合
これを行うMavenの方法を考慮してください-ローカルリポジトリを作成します。C:\libs はライブラリが存在する場所であり、.jar は後で PC の任意の場所からそれらにアクセスできます。
または、Maven を使用することもできます。すべての依存関係 (ライブラリ) を含むアプリケーションの配布に関する議論があります: Java: Maven ベースのプロジェクトのスタンドアロン配布を構築するにはどうすればよいですか? .
その jar ファイルを次の場所にコピーします。
C:\Program Files\Java\jdk\jre\lib\ext
と
C:\Program Files\Java\jre\lib\ext
標準インポートと同様に、Netbeans および手動インポートで使用できるはずです。
この問題のおそらく最も簡単な解決策をここで見つけました。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>
</project>
プロジェクトのルートにある build.xml に移動し、最後のタグの直前にコードを追加します。
ここで、最初のプロパティ フィールドの値をコメントどおりに変更し、変更を保存します。
今後は、プロジェクトをクリーンアップしてビルドするたびに、依存関係を含む完全な jar がプロジェクトの dist フォルダーに生成されます。
これを試してください-Netbeans IDEで:
これは私のために働いたものです:
プロジェクトに Excel エクスポート機能を組み込みました。この目的で使用した 2 つの外部 .jar は、jxl.jar と sx.jar でした。
META ファイルなしで 7-Zip を使用して、これら 2 つの jar ファイルをフォルダー (Java クラス) に解凍します。プロジェクト jar を、META ファイルを含む同じフォルダーに解凍します。
JARMaker を使用して Java クラス フォルダ全体を再パックし、プロジェクト .jar を元の配布フォルダに再作成します ... すると、完全な Excel 機能が実行されます。
次に従ってください:- 1. NetBeans エディタで開いたプロジェクトを右クリックします。 2. プロパティを選択します。 3. ライブラリを選択します。 4. jar を追加します。 5. [OK] をクリックします。
これを使用することもできます (ライブラリが「dist/lib」にない場合)。NetBeans と ant-contrib でテストされています。
<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>