如何将资源添加到类路径 [英] How to add resources to classpath

查看:24
本文介绍了如何将资源添加到类路径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

How do you add a folder (e.g. a resource folder containing arts) to the classpath of a netbeans project? I managed to do that manually via editing the NB generated jar file of the project (that is its MANIFEST.MF file + copying the resources manually), but there should be a way to tell netbeans as well to mind the resources, no?

文件夹结构如下:

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

我不想将艺术品打包到罐子里,因为我希望艺术品易于更换.如果我将艺术文件夹添加到 src 文件夹,那么 NB 编译正常,但艺术资源最终在 jar 中.

I don't want to package the art into the jar because I'd like the art to be easily exchangeable. If I add the art folder to the src folder then NB compiles fine, but the art resources end up in the jar.

将 art 文件夹添加到 netbeans 项目库(属性 -> 库 -> 添加 JAR/文件夹)似乎不起作用,因为后来我得到了一个错误 '...projectart is a directory or can不被阅读.不复制图书馆.这反过来又会阻止复制真正的库文件夹.

Adding the art folder to the netbeans project libraries (Properties -> Libraries -> Add JAR/Folder) seemed not to work, because then I ended up with an error '...projectart is a directory or can't be read. Not copying the libraries.' which in turn prevents even the real libraries folder from being copied.

有什么想法吗?

最好的问候克里斯

2 观察结果,基于 gpeche 的评论:a) 而不是在运行"选项卡中指定附加资源文件夹而不是在项目属性的编译"选项卡中 -> 库在 Netbeans 中似乎没有太大区别(我目前使用的是 6.9.1).输出(因此错误)保持不变,即根本没有复制任何内容:

2 Observations made, based on the comments from gpeche: a) Rather specifying the additional resources folder in the "Run" tab than in the "Compile" tab of the project properties -> Libraries doesn't seem to make a lot of difference in Netbeans (I'm currently using 6.9.1). The output (and thus error) stays the same, that is nothing gets copied at all:

Created dir: C:UsersChrisiDesktopvocabularyVocabularyTrainerdist
C:UsersChrisiDesktopvocabularyVocabularyTrainerart is a directory or can't be read. Not copying the libraries.
Not copying the libraries.
Building jar: C:UsersChrisiDesktopvocabularyVocabularyTrainerdistVocabularyTrainer.jar

另一个有趣的方面是在库面板的帮助菜单中没有明确提及将文件夹视为库.有没有可能,Netbeans 中的按钮被错误命名,只允许使用真正的 jar ?

Another interesting aspect is that in the help menu of the Libraries panel nothing is explicitly mentioned regarding folders as libraries. Could it be possible, that the button in Netbeans is falsely named, that is only real jar's are allowed?

b) 将资源文件夹添加到库列表确实会产生影响,将另一个条目添加到 MANIFEST.MF.虽然 - 这是较小的问题 - 类路径条目似乎总是期望资源文件夹是库文件夹的子文件夹(例如lib/arts"),但主要问题是似乎缺少斜线.如前所述,在 MANIFEST.MF 中 NB 生成的条目看起来像这样的lib/arts"(这对我不起作用),而(手动设置)lib/arts/"呢?!

b) Adding the resources folder to the Libraries list does have the impact though, to add another entry to the MANIFEST.MF. While - and that's the smaller issue - the classpath entry seems to be always expecting the resource folder to be a subfolder of the library folder (e.g. "lib/arts") the major problem is that there seems to be a slash missing. As mentioned the NB generated entry in the MANIFEST.MF will look like this "lib/arts" (which does not work for me), while (manually set) "lib/arts/" does?!

我使用文件夹中资源的方式是这样的:

The way I use resources from the folder is something like this:

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

基于 Tushars 评论和 这篇帖子我发现以下解决方案是功能性和舒适性之间可接受的权衡.

Based on Tushars comment and this posting I found the following solution to be an acceptable tradeoff between functionality and comfort.

我从自动生成的build-impl.xml"文件中覆盖了 ANT 目标,该文件在 Netbeans 项目的基本build.xml"文件中的 MANIFEST.MF 文件中创建了类路径.转到build.xml"文件的代码如下所示:

I override the ANT target from the auto generated 'build-impl.xml' file which creates the Class-Path in the MANIFEST.MF file in the basic 'build.xml' file of the Netbeans project. The code which goes to the 'build.xml' file looks like this:

  <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"文件夹中,并带有消息

The tradeoff is that for development in Netbeans I still have to add the resource folder (e.g. 'art') to the libraries list to make the project run in Netbeans. This will cause an additional entry in the MANIFEST.MF file ('lib/art') along with the effect that the libraries will not get automatically copied to the 'dist' folder, with the message

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

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

This behavor is - afaik - intended (to force everything to be bundled up in a jar), even though there are discussions about it going on. To make a real distribution bundle I'd have to take away the resource folder(s) from the library list in NB and rebuild.

当然,我们仍然欢迎有关更简化设置而不进行任何权衡的想法.:)

Ideas about a more streamlined setup without any tradeoffs are of course still welcome. :)

推荐答案

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

当您清理并构建基于 NetBeans Ant 的项目时,它会在项目的根目录中创建一个 manifest.mf 文件.该文件也包含在 JAR 文件中.修改此文件并添加如下条目:

When you Clean-&-Build a NetBeans Ant Based Project it creates a manifest.mf file in the root directory of the project. This file gets included in the JAR file also. Modify this file and add entry like follows:

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

斜线在类路径中的艺术之后很重要.

slash is important after arts in the class path.

在发行版中包含艺术资源文件夹

要么在build后把这个文件夹复制到dist文件夹下,或者添加一个ANT target把需要的资源复制到dist文件夹中.

Either copy this folder in the dist folder after the build or add a ANT target to copy the required resources in the dist folder.

在 build.xml 文件中添加如下目标:

Add the target like as follows in the build.xml file:

<target name="-post-jar">
     <mkdir dir="${dist.dir}/resources"/>
     <copy todir="${dist.dir}/resources">
         <fileset dir="${basedir}/resources" />
     </copy>
 </target>

  • 访问此类资源的代码:

    访问此类资源文件所需的代码如下:(这在设计时不起作用,但肯定来自JAR文件)

    The code needed to access such resource files shall be as follows: (This will not work in design time but surely from the JAR file)

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

    注意:位于项目根目录中的文件 manifest.mf 和 build.xml 可从 NetBeans IDE 的文件"面板访问

    NOTE: The files manifest.mf and build.xml located in the root directory of the project are accessible from the Files Panel in NetBeans IDE

    这篇关于如何将资源添加到类路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

  • 查看全文
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆