2

- - - - -編集 - - -

そのため、エラーは、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 が実行時に動作する方法に違いがあるのはなぜですか。見落としている細かいところがあるような気がします。

4

1 に答える 1

0

あなたの問題が何であるか完全に明確ではないので、ここに私の観察があります:

jar クラスパス マニフェスト エントリの管理

次の回答は、ANT manifestclasspathタスクを使用して、実行可能な jar マニフェストで "Class-Path" 属性を動的に構築する方法を示しています。

Ant - 特定のフォルダー内のすべてのファイルの名前を取得する方法

サードパーティの依存関係の管理

ビルドで多数のオープン ソース jar を管理している場合は、Apache ivyプラグインを使用してそれらを自動的にダウンロードすることを検討してください。

より良い方法として、 Nexusのような専用のリポジトリ マネージャーをデプロイして、すべてのビルドの依存関係をホストすることができます。

于 2012-04-25T17:42:21.607 に答える