当前位置: 首页 > 面试题库 >

如何向类路径添加资源

赵正雅
2023-03-14
问题内容

如何在netbeans项目的类路径中添加文件夹(例如,包含arts的资源文件夹)?我设法通过编辑项目的NB生成的jar文件(即其MANIFEST.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)将资源文件夹添加到库列表中确实会产生影响,将另一个条目添加到MANIFEST.MF。虽然-这是较小的问题-
类路径条目似乎总是期望资源文件夹是库文件夹的子文件夹(例如“ lib/arts”),但主要的问题是似乎缺少斜线。如前所述,MANIFEST.MF中的NB生成的条目看起来像这样的“ lib /
arts”(对我不起作用),而(手动设置)“ lib / arts /”可以吗?

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

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

编辑:

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

我从自动生成的“ 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中的开发,我仍然必须将资源文件夹(例如“
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中的库列表中删除资源文件夹,然后重新构建。

当然,仍然欢迎人们提出关于不进行任何权衡的更简化设置的想法。:)


问题答案:
  1. 将资源文件夹添加到类路径:

清理和构建基于NetBeans
Ant的项目时,它将在项目的根目录中创建manifest.mf文件。该文件也包含在JAR文件中。修改此文件并添加条目,如下所示:

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

斜线在上课之路很重要。

  1. 在发行版中包含arts资源文件夹

在构建之后将这个文件夹复制到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>
  1. 访问此类资源的代码:

访问此类资源文件所需的代码如下:(这在设计时将无法正常工作,但肯定会在JAR文件中进行)

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

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



 类似资料:
  • 我正在尝试运行一个由其他人创建的已经存在的eclipse项目。 在将其导入eclipse并尝试作为->Java应用程序运行之后,它失败了,因为它在bin/resources中找不到.properties文件 我打印出eclipse使用的类路径 果然,它包括bin和所有lib/*.jars,但不包括bin/resources。将.properties文件复制到bin中可以使程序正常工作,但我想了解如

  • 我正在使用Java代理和Javassist向一些JDK类添加一些日志记录。实际上,当系统加载一些TLS类时,Javassist会向它们添加一些额外的字节码,以帮助我调试一些连接问题。 问题是,考虑到这个类包含在代理jar中: 在我的代理的转换方法中,假设我试图使用javassist调用该类: 你认为这行得通,但我得到了这个: 有没有办法将该类[]添加到应用程序的类路径中?

  • 问题内容: 我正在尝试向PYTHONPATH环境变量添加路径,该路径仅在特定的virtualenv环境中可见。 我在virtualenv命令提示符下进行了尝试,但这为整个环境设置了变量。 我该如何实现? 问题答案: 通常,您可以通过使用files来避免对PYTHONPATH做任何事情。只需在您的virtualenv的site- packages文件夹中放入一个扩展名为.pth的文件(任何基本名称均

  • 我正在使用 karaf 4.0.5 和 osgi 进行一个项目。我们有客户端代码来调用 REST API,这需要加载 3 个“*.属性”文件。我得到了一个客户端jar,我用它来调用服务器端类和方法(包含我无法更新的代码)。所需的属性文件存在于提供的客户端 jar 中,但其代码仍无法找到并加载它们。 在调试我的pax考试时,我发现它没有从jar加载资源文件的可能原因如下。 用于加载文件的代码似乎仅尝

  • 我希望title本身是描述性的,但要明确的是,我试图在greeting-service.jar中包含(即,error-handling-service.jar)。在构建之后,我在新项目(即TestApplication)中包含了greeting-service.jar,但在执行我得到的TestApplication时(顺便说一句,TestApplication不是一个gradle项目) BaseE

  • 我正在尝试使用第三方应用程序来测试Liberty Server18.0,并尝试在Linux上向Liberty Server类路径添加一个库。这个库名为:“com.ibm.websphere.javaee.security.1.0_1.0.21.jar”,它位于Liberty服务器的“/wlp/dev/api/sec”下。 我看得出来,它从来没上过子弹。我如何将这个jar添加到我的defaultSe