web-dev-qa-db-ja.com

クラスパスにリソースを追加する方法

Netbeansプロジェクトのクラスパスにフォルダー(アートを含むリソースフォルダーなど)を追加するにはどうすればよいですか?プロジェクトのNB生成されたjarファイル(つまり、そのMANIFEST.MFファイル+リソースを手動でコピー)を編集して手動でそれを行うことができましたが、netbeansにリソースを気にしないでください?

フォルダ構造は次のようになります。

/project/art/
/project/dist/lib/
/project/dist/art/
/project/dist/project.jar
/project/lib/
/project/src/

アートを簡単に交換できるようにしたいので、アートを瓶に詰めたくありません。アートフォルダーをsrcフォルダーに追加すると、NBは正常にコンパイルされますが、アートリソースはjarになります。

アートフォルダーをnetbeansプロジェクトライブラリに追加(プロパティ->ライブラリ-> JAR /フォルダーの追加)が機能していないように見えました。エラー '...\project\artはディレクトリであるか、できない読んだ。ライブラリをコピーしません。」これにより、実際のライブラリフォルダもコピーされなくなります。

何か案は?

よろしくクリス

2 gpecheからのコメントに基づいて行われた観察:a)プロジェクトプロパティの[コンパイル]タブではなく[実行]タブで追加のリソースフォルダーを指定する->ライブラリはそれほど違いはないようですNetbeans(現在6.9.1を使用しています)。出力(およびエラー)は同じままです。つまり、何もコピーされません。

Created dir: C:\Users\Chrisi\Desktop\vocabulary\VocabularyTrainer\dist
C:\Users\Chrisi\Desktop\vocabulary\VocabularyTrainer\art is a directory or can't be read. Not copying the libraries.
Not copying the libraries.
Building jar: C:\Users\Chrisi\Desktop\vocabulary\VocabularyTrainer\dist\VocabularyTrainer.jar

別の興味深い側面は、ライブラリパネルのヘルプメニューには、フォルダをライブラリとして明示的に記載されていないことです。 Netbeansのボタンに間違った名前が付けられている可能性はありますか。つまり、実際のjarのみが許可されていますか?

b)リソースフォルダをライブラリリストに追加すると、MANIFEST.MFに別のエントリを追加することに影響があります。一方、それは小さな問題ですが、クラスパスエントリは常にリソースフォルダーがライブラリフォルダー(たとえば「lib/arts」)のサブフォルダーであることを期待しているようです。大きな問題は、スラッシュが欠落しているように見えることです。前述のように、MANIFEST.MFでNB生成されたエントリは、この「lib/arts」(これは機能しません)のように見えますが、(手動で設定)「lib/arts /」は?!

フォルダからリソースを使用する方法は次のようなものです。

URL resource = getClass().getResource("/gui/refresh.png");
ImageIcon tmp = new ImageIcon(resource);

編集:

Tusharsのコメントと この投稿 に基づいて、次の解決策が機能性と快適さの間の許容可能なトレードオフであることがわかりました。

Netbeansプロジェクトの基本的な 'build.xml'ファイルのMANIFEST.MFファイルにClass-Pathを作成する自動生成された 'build-impl.xml'ファイルからANTターゲットをオーバーライドします。 「build.xml」ファイルに移動するコードは次のようになります。

  <property name="art.classpath" value="art/" />

  <target name="-post-jar">
    <mkdir dir="${dist.dir}/art"/>
    <copy todir="${dist.dir}/art">
      <fileset dir="${basedir}/art">
        <!-- <exclude name="**/!source/**"/> if you want to exclude something... -->
      </fileset>
    </copy>
  </target>

  <target name="-init-macrodef-copylibs">
    <macrodef name="copylibs" uri="http://www.netbeans.org/ns/j2se-project/3">
      <element name="customize" optional="true"/>
      <sequential>
        <property location="${build.classes.dir}" name="build.classes.dir.resolved"/>
        <pathconvert property="run.classpath.without.build.classes.dir">
          <path path="${run.classpath}"/>
          <map from="${build.classes.dir.resolved}" to=""/>
        </pathconvert>
        <pathconvert pathsep=" " property="jar.classpath">
          <path path="${run.classpath.without.build.classes.dir}"/>
          <chainedmapper>
            <flattenmapper/>
            <globmapper from="*" to="lib/*"/>
          </chainedmapper>
        </pathconvert>
        <taskdef classname="org.netbeans.modules.Java.j2seproject.copylibstask.CopyLibs" classpath="${libs.CopyLibs.classpath}" name="copylibs"/>
        <copylibs compress="${jar.compress}" index="${jar.index}" jarfile="${dist.jar}" manifest="${manifest.file}" runtimeclasspath="${run.classpath.without.build.classes.dir}">
          <fileset dir="${build.classes.dir}"/>
          <manifest>
            <attribute name="Class-Path" value="${jar.classpath} ${art.classpath}"/>
            <customize/>
          </manifest>
        </copylibs>
      </sequential>
    </macrodef>
  </target>

トレードオフは、Netbeansでの開発では、リソースフォルダー(例: 'art')をライブラリリストに追加して、プロジェクトをNetbeansで実行する必要があることです。これにより、MANIFEST.MFファイル(「lib/art」)に追加のエントリが追加され、ライブラリが「dist」フォルダに自動的にコピーされないというメッセージが表示されます。

...\art is a directory or can't be read. Not copying the libraries.
Not copying the libraries.

この振る舞いは-afaik-進行中の議論があったとしても(すべてをjarにまとめるように)意図したものです。実際の配布バンドルを作成するには、NBのライブラリリストからリソースフォルダーを削除して再構築する必要があります。

トレードオフのない、より合理化されたセットアップに関するアイデアはもちろん歓迎されます。 :)

16
ChristianS
  1. リソースパスをクラスパスに追加:

    NetBeans Antベースのプロジェクトをクリーン&ビルドすると、プロジェクトのルートディレクトリにmanifest.mfファイルが作成されます。このファイルはJARファイルにも含まれます。このファイルを変更し、次のようにエントリを追加します。

    Manifest-Version: 1.0
    X-COMMENT: Main-Class will be added automatically by build
    Class-Path: arts/  
    

    スラッシュは、クラスパスの芸術の後に重要です。

  2. ディストリビューションにartsリソースフォルダーを含める

    ビルド後にこのフォルダーをdistフォルダーにコピーするか、ANTターゲットを追加して、distフォルダーに必要なリソースをコピーします。

    Build.xmlファイルに次のようにターゲットを追加します。

    <target name="-post-jar">
         <mkdir dir="${dist.dir}/resources"/>
         <copy todir="${dist.dir}/resources">
             <fileset dir="${basedir}/resources" />
         </copy>
     </target>
    
  3. そのようなリソースにアクセスするためのコード:

    このようなリソースファイルにアクセスするために必要なコードは次のとおりです(これは設計時には機能しませんが、JARファイルからは確実に機能します)。

    // pay attention to relative path
    URL resource = ClassLoader.getSystemResource("gui/refresh.png"); 
    ImageIcon tmp = new ImageIcon(resource);
    

    注:プロジェクトのルートディレクトリにあるmanifest.mfファイルとbuild.xmlファイルには、NetBeans IDEのファイルパネルからアクセスできます。

14
Tushar Joshi

NetBeans 8.0.2の使用:

  1. プロジェクトを右クリックします。
  2. Propertiesを選択します。
  3. Sourcesを選択します。
  4. ソースパッケージフォルダーフォルダーの追加をクリックします。
  5. リソースが存在するディレクトリを選択します。
  6. ディレクトリ名のOpenをクリックします。
  7. [〜#〜] ok [〜#〜]をクリックして、プロジェクトプロパティダイアログを閉じます。

リソースがプロジェクトに追加されます。

ナビゲーションペインにもディレクトリが追加されます。

他のプロジェクトでは、リソースが利用可能になりました。たとえば、画像を読み取るには:

BufferedImage zero = ImageIO.read(OCR.class.getResourceAsStream("/0.bmp"));
10
Squiggler

Lib/artをClass-Pathから削除し、「ディレクトリか読み取り不可」にならないようにするには、パスからlib/artを削除する必要があります。

    <pathconvert property="run.classpath.without.build.classes.dir">
      <path path="${run.classpath}"/>
      <map from="${build.classes.dir.resolved}" to=""/>
      **<map from="${basedir}/art" to=""/> <!-- remove art from lib -->**
    </pathconvert>
1
eml