如何向classpath添加资源

时间:2010-09-15 13:43:01

标签: java netbeans classpath

如何将文件夹(例如包含arts的资源文件夹)添加到netbeans项目的类路径中?我设法通过编辑项目的NB生成的jar文件(即MANIFEST.MF文件+手动复制资源)手动完成,但是应该有一种方法告诉netbeans也要记住资源,不是吗? / p>

文件夹结构如下所示:

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

我不想将艺术品打包到罐子里,因为我希望这种艺术很容易交换。如果我将art文件夹添加到src文件夹,那么NB编译得很好,但艺术资源最终会在jar中。

将art文件夹添加到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评论和this posting我发现以下解决方案在功能性和舒适性之间是可接受的权衡。

我从自动生成的'build-impl.xml'文件中覆盖ANT目标,该文件在Netbeans项目的基本'build.xml'文件中的MANIFEST.MF文件中创建Class-Path。转到'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 - 意图(迫使所有东西被捆绑在一个罐子里),即使有关于它的讨论。要制作一个真实的分发包,我必须从NB中的库列表中取出资源文件夹并重建。

关于更简化设置而没有任何权衡的想法当然仍然受欢迎。 :)

3 个答案:

答案 0 :(得分:13)

  1. 将资源文件夹添加到类路径:

    当您清理 - 并且 - 建立基于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的“文件”面板访问

答案 1 :(得分:10)

使用NetBeans 8.0.2:

  1. 右键单击该项目。
  2. 选择属性
  3. 选择来源
  4. 点击源文件夹文件夹添加文件夹
  5. 选择资源所在的目录。
  6. 点击目录名称上的打开
  7. 点击确定关闭项目属性对话框。
  8. 资源已添加到项目中。

    您还会在导航窗格中看到添加的目录

    在另一个项目中,资源现已可用。例如,要读取图像:

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

答案 2 :(得分:1)

为了从Class-Path中删除lib / art而不是“是目录或无法读取”,需要从路径中删除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>