如何将资源添加到类路径

2022-09-03 01:09:59

如何将文件夹(例如,包含艺术的资源文件夹)添加到 netbeans 项目的类路径中?我设法通过编辑NB生成的项目jar文件(即其清单)来手动执行此操作。MF文件+手动复制资源),但应该有一种方法可以告诉netbeans以及注意资源,不是吗?

文件夹结构如下所示:

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

我不想把艺术品包装进罐子里,因为我希望艺术品易于交换。如果我将 art 文件夹添加到 src 文件夹中,则 NB 编译正常,但 art 资源最终会进入 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)将资源文件夹添加到库列表确实会产生影响,从而将另一个条目添加到清单中。断续器虽然 - 这是一个较小的问题 - 类路径条目似乎总是期望资源文件夹是库文件夹的子文件夹(例如“lib/arts”),但主要问题是似乎缺少斜杠。如前所述,NB在清单中生成的条目。MF看起来像这个“lib/arts”(这对我不起作用),而(手动设置)“lib/arts/”呢?!

我使用文件夹中资源的方式如下所示:

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

编辑:

根据Tushars的评论和这篇文章,我发现以下解决方案在功能和舒适性之间是一个可以接受的权衡。

我从自动生成的“build-impl.xml”文件中覆盖ANT目标,该文件在MANIFEST中创建类路径。Netbeans 项目的基本“build.xml”文件中的 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 中的开发,我仍然必须将资源文件夹(例如'art')添加到库列表中,以使项目在 Netbeans 中运行。这将导致清单中出现其他条目。MF 文件(“lib/art”)以及库不会自动复制到“dist”文件夹的效果,并显示消息

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

这种行为是 - afaik - 旨在(强制将所有东西捆绑在一个罐子里),即使有关于它的讨论正在进行中。要制作一个真正的分发包,我必须从NB的库列表中取出资源文件夹并重建。

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


答案 1
  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 文件夹中所需的资源。

    在生成.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 中的“文件”面板访问


答案 2

使用 NetBeans 8.0.2:

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

资源将添加到项目中。

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

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

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

推荐