- - - - -編集 - - -
そのため、エラーは、jar をクリックして起動するのではなく、コマンド ラインの起動に起因していることに気付きました。基本的に、実際に存在するフォルダー以外の任意のフォルダーから jar を実行すると、リソースが誤って参照されます。コマンドラインで同じフォルダーから実行すると、この問題はなくなります。したがって、実行がどこから呼び出されたかに関係なく、jar とリソースを相対的に参照するにはどうすればよいでしょうか。
- - - - 編集 - - -
配布用にビルドされたプロジェクトを取得しようとすると、いくつかの問題が発生します。プロジェクト構造は、6 つのパッケージがあるようなものです。各パッケージは、Gui と Engine の 2 つのサブパッケージに分割されます。各サブパッケージには、実行可能なメイン クラスがあります。「共通」パッケージは、他のパッケージのラッパーであり、選択されたパッケージを起動します。私の目標は、各パッケージをエンジン側のスタンドアロンにまとめることです。これは、エンジンのコマンド ライン テストに使用されます。「共通」jar はすべてのリソースと一緒に配置され、アプリケーション全体を実行します。
私の問題は、プロジェクトをクリーンアップする必要があることに起因しています。そのため、リファクタリングと再パッケージ化が行われていますが、プロジェクトをビルドして jar するために現在使用されている方法は、クラス ファイルを (パッケージ/フォルダー構造を考慮して) 最終フォルダーの場所にコピーするバッチ スクリプトです。そこから jar がコマンド ラインで作成され、クラス パスとメイン クラスがマニフェスト ファイルにまとめられます。これは問題なく動作し、jar は正しい構造とクラスパスでコンパイルされ、すべてが正しく実行されます。ただし、プロジェクトを構築している人に応じて場所とともに、パッケージ構造が変更されるものに変更する必要があるため、xcopy コマンドを正しく維持するのは面倒です。
したがって、私の解決策は、build.xml を使用し、netbeans 用の ant ビルドを概説することでした。これにより、プロジェクト構造の変更が尊重され、ビルドが netbeans の内部に保持されます。私が抱えている正確な問題は、使用されるビルド方法に関係なく.(バッチ/ビルドスクリプト)いずれかの方法を使用してjarファイル内の正確なフォルダー構造を取得し、クラスパスがまったく同じであることです。私の common.jar はプロジェクトに対して正常に動作しますが、エンジンのテスト jar はクラスパスまたは参照の問題に遭遇します。Ant スクリプト、バッチ ファイル、および使用されるマニフェスト ファイルの大部分を含めます。
バッチファイル
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\Common C:\Emerson\Common\
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\Common\gui C:\Emerson\Common\gui\
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\Common\Meg C:\Emerson\Common\Meg\
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\Pressu re C:\Emerson\Pressure\
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\Pressure\Gui C:\Emerson\Pressure\Gui\
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\Pressure\Meg C:\Emerson\Pressure\Meg\
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\PressureV2 C:\Emerson\PressureV2\
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\PressureV2\Gui C:\Emerson\PressureV2\Gui\
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\PressureV2\Gui\controller C:\Emerson\PressureV2\Gui\controller
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\PressureV2\Gui\models C:\Emerson\PressureV2\Gui\models
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\PressureV2\Gui\rules C:\Emerson\PressureV2\Gui\rules
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\Temp\Gui C:\Emerson\Temp\Gui\
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\Temp\Meg C:\Emerson\Temp\Meg\
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\rfdFlow\Gui C:\Emerson\rfdFlow\Gui\
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\rfdFlow\Meg C:\Emerson\rfdFlow\Meg\
xcopy /Y C:\Users\tfollansbee\Documents\NetBeansProjects\Emerson\branches\Merge\build\classes\utils C:\Emerson\utils\
"C:\Program Files\Java\jdk1.6.0_25\bin\jar" cvmf mainClass tempAsynch.jar Temp/*
"C:\Program Files\Java\jdk1.6.0_25\bin\jar" cvmf mainClass Common.jar Common/*
"C:\Program Files\Java\jdk1.6.0_25\bin\jar" cvmf pressureClass Pressure.jar Pressure/*
"C:\Program Files\Java\jdk1.6.0_25\bin\jar" cvmf pressureV2Class PressureV2.jar PressureV2/*
"C:\Program Files\Java\jdk1.6.0_25\bin\jar" cvmf rfdClass rfdFlow.jar rfdFlow/*
"C:\Program Files\Java\jdk1.6.0_25\bin\jar" cvmf pressureV2Class utils.jar utils/*
rmdir /s /q C:\Emerson\Common
rmdir /s /q C:\Emerson\Pressure
rmdir /s /q C:\Emerson\PressureV2
rmdir /s /q C:\Emerson\Temp
rmdir /s /q C:\Emerson\rfdFlow
rmdir /s /q C:\Emerson\utils
xcopy /Y C:\Emerson\Common.jar C:\GCCDEV
xcopy /Y C:\Emerson\tempAsynch.jar C:\GCCDEV
xcopy /Y C:\Emerson\Pressure.jar C:\GCCDEV
xcopy /Y C:\Emerson\PressureV2.jar C:\GCCDEV
xcopy /Y C:\Emerson\rfdFlow.jar C:\GCCDEV
xcopy /Y C:\Emerson\utils.jar C:\GCCDEV
ビルド スクリプト
<?xml version="1.0" encoding="UTF-8"?>
<project name="Emerson" default="default" basedir=".">
<description>Builds, tests, and runs the project Emerson.</description>
<property environment="env"/>
<property name="baseDir" value="build/classes/" />
<property name="cp" value=" . utils.jar lib/pfcasync.jar lib/poi-3.7/poi-ooxml-schemas-3.7-20101029.jar lib/poi-3.7/poi-3.7-20101029.jar lib/poi-3.7/poi-ooxml-3.7-20101029.jar lib/poi-3.7/ooxml-lib/xmlbeans-2.3.0.jar lib/poi-3.7/ooxml-lib/dom4j-1.6.1.jar lib/xom/xom-1.2.7.jar lib/jgoodies/jgoodies-common-1.3.0.jar lib/jgoodies/jgoodies-binding-2.6.0.jar lib/resources/** Common.jar
" />
<import file="nbproject/build-impl.xml"/>
<target name="-pre-jar">
<echo message="-pre-jar" />
<delete dir="${env.PTC_STD}/lib/" />
<delete dir="${env.PTC_STD}/resources/" />
<!--delete dir="${env.PTC_STD}/build/" /-->
<echo message="aJar" />
<jar destfile="${env.PTC_STD}/Common.jar" basedir="${baseDir}">
<manifest>
<attribute name="Class-Path" value="${cp}" />
<attribute name="Main-Class" value="Common.gui.emersonWrapper" />
</manifest>
</jar>
<jar destfile="${env.PTC_STD}/tempAsynch.jar" index="false" basedir="${baseDir}" includes="Temp/**">
<manifest>
<attribute name="Class-Path" value="${cp}" />
<attribute name="Main-Class" value="Temp.Meg.tempasynch" />
</manifest>
</jar>
<jar destfile="${env.PTC_STD}/Pressure.jar" index="false" basedir="${baseDir}" includes="Pressure/**">
<manifest>
<attribute name="Class-Path" value="${cp}" />
<attribute name="Main-Class" value="Pressure.Meg.P3051STest" />
</manifest>
</jar>
<jar destfile="${env.PTC_STD}/PressureV2.jar" index="false">
<fileset dir="${baseDir}">
<include name="PressureV2/**" />
<include name="utils/**" />
</fileset>
<manifest>
<attribute name="Class-Path" value="${cp}" />
<attribute name="Main-Class" value="PressureV2.Gui.PressureV2Main" />
</manifest>
</jar>
<jar destfile="${env.PTC_STD}/rfdFlow.jar" index="false" basedir="${baseDir}" includes="rfdFlow/**">
<manifest>
<attribute name="Main-Class" value="rfdFlow.Meg.main" />
<attribute name="Class-Path" value="${cp}" />
</manifest>
</jar>
<jar destfile="${env.PTC_STD}/utils.jar" index="false" basedir="build/classes/" includes="utils/**">
<manifest>
<attribute name="Class-Path" value="${cp}" />
<attribute name="Main-Class" value="PressureV2.Gui.PressureV2Main" />
</manifest>
</jar>
<copy todir="C:/Emerson/resources/">
<fileset dir="resources/">
<exclude name="**/*.svn"/>
</fileset>
</copy>
<copy todir="C:/Emerson/lib/">
<fileset dir="lib/">
<include name="**/*.jar" />
<include name="**/resources/**" />
</fileset>
</copy>
</target>
</project>
共通のマニフェスト ファイル。含まれるクラスパスは、他のすべてのマニフェスト ファイルとまったく同じです
Main-Class: Common.gui.emersonWrapper
Class-Path: . utils.jar lib/pfcasync.jar lib/poi-3.7/poi-ooxml-schemas-3.7-20101029.jar lib/poi-3.7/poi-3.7-20101029.jar lib/poi-3.7/poi-ooxml-3.7-20101029.jar lib/poi-3.7/ooxml-lib/xmlbeans-2.3.0.jar lib/poi-3.7/ooxml-lib/dom4j-1.6.1.jar lib/xom/xom-1.2.7.jar lib/jgoodies/jgoodies-common-1.3.0.jar lib/jgoodies/jgoodies-binding-2.6.0.jar lib/resources/** Common.jar
実行時には、jar はすべて、参照されるすべてのライブラリ jar を含む「lib」フォルダーと一緒に同じフォルダーに存在します。いくつかの画像といくつかの xml データと共に。jar を作成する際に気付いた 1 つの違いは、バッチ ファイルがインデックスを作成しなかったことです。もともと私の ant スクリプトには index="true" があり、たとえば pressure.jar を実行すると、java.lang.NoClassDefFoundError が発生しました。index="false" を設定すると、これらのエラーは解消されますが、相対パスの xml ファイルが lib/resources/xml/a.xml に見つかりません。2 日間かけて、jar 構造、フォルダー構造、およびクラスパスを調べました。build.xml では、バッチ ファイルで使用されているマニフェスト ファイルにリンクしても成功しませんでした。すべてが同じように表示されるため、これらの jar が実行時に動作する方法に違いがあるのはなぜですか。見落としている細かいところがあるような気がします。