2010-09-15 133 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"));