2010-09-15 130 views
13

如何將一個文件夾(例如包含arts的資源文件夾)添加到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中。

將art文件夾添加到NetBeans項目庫(屬性 - >庫 - >添加JAR /文件夾)似乎不起作用,因爲然後我結束了錯誤'... \ project \ art是一個目錄或不能被讀取。不要複製這些庫。「這反過來又阻止了真正的庫文件夾被複制。

任何想法?

問候 克里斯

取得

2意見的基礎上,從gpeche評論: 一),而指定比在項目屬性的「編譯」選項卡中的「運行」選項卡中的其他資源文件夾 - >圖書館在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評論和this posting我發現下面的解決方案是功能性之間的可接受的折衷和舒適。

我從自動生成的「build-impl.xml」文件中覆蓋ANT目標,該文件在Netbeans項目的基本「build.xml」文件的MANIFEST.MF文件中創建類路徑。都到了「的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的發展我還是要資源文件夾(如「藝術」)添加到庫列表,以使項目在Netbeans中運行。這將在MANIFEST中引起額外的輸入。MF文件(「LIB /藝術」),與該庫將不會自動複製到「DIST」文件夾中的作用,與消息

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

這behavor一起是 - 據我所知 - 意(迫使一切被捆綁在一個罐子裏),即使有關於它正在進行的討論。要製作一個真正的分發包,我必須從NB中的庫列表中取出資源文件夾並重建。

關於更簡化的設置沒有任何折衷的想法當然仍然受歡迎。 :)

回答

12
  1. 添加資源文件夾到類路徑:

    當你潔淨& -build一個NetBeans基於Ant項目也將在項目的根目錄下的MANIFEST.MF文件。該文件也包含在JAR文件中。修改此文件並添加如下條目:

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

    斜槓在班級路徑中的藝術後很重要。

  2. 包括分佈

    無論此文件夾中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

+0

1)增加一些對NB項目MANIFEST.MF文件(也就是在這種情況下,類路徑)似乎覆蓋任何東西,否則去那裏(例如:其他庫添加到項目中)。任何想法如何獲得原始路徑?例如,庫本身將被複制。 3)對我來說,它不工作沒有主導斜線 - 我必須添加斜線,然後它的作品。 – ChristianS 2010-09-16 06:39:51

+0

我建議首先從NetBeans生成生成manifest.mf,然後使用這些默認類路徑值以及添加的其他目錄路徑。 – 2010-09-17 02:37:34

+0

請同時添加指南如何排除文件夾資源,所以它不會被包括在.jar – GusDeCooL 2013-07-09 19:23:13

1

爲了從類路徑中刪除的lib /藝術,並沒有得到「是一個目錄或不能讀」需要從路徑刪除的lib /藝術:

<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> 
8

使用NetBeans 8.0.2:

  1. 右鍵單擊該項目。
  2. 選擇屬性
  3. 選擇來源
  4. 點擊添加文件夾源包文件夾
  5. 選擇資源所在的目錄。
  6. 點擊打開目錄名稱上的
  7. 點擊確定關閉項目屬性對話框。

資源被添加到項目中。

你會看到在您的導航窗格以及

在其他項目中添加了目錄,資源等,應有盡有。例如,讀取圖像:

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