Java 如何将资源添加到类路径
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/3718201/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How to add resources to classpath
提问by ChristianS
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?
如何将文件夹(例如包含艺术的资源文件夹)添加到 netbeans 项目的类路径?我设法通过编辑项目的 NB 生成的 jar 文件(即其 MANIFEST.MF 文件+手动复制资源)来手动执行此操作,但是应该有一种方法可以告诉 netbeans 以及注意资源,不是吗?
The folder structure looks like this:
文件夹结构如下所示:
/project/art/
/project/dist/lib/
/project/dist/art/
/project/dist/project.jar
/project/lib/
/project/src/
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.
我不想将艺术品打包到罐子里,因为我希望艺术品易于更换。如果我将艺术文件夹添加到 src 文件夹,那么 NB 编译正常,但艺术资源最终在 jar 中。
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 '...\project\art is a directory or can't be read. Not copying the libraries.' which in turn prevents even the real libraries folder from being copied.
将 art 文件夹添加到 netbeans 项目库(属性 -> 库 -> 添加 JAR/文件夹)似乎不起作用,因为后来我得到了一个错误 '...\project\art is a directory or can't be读。不复制图书馆。这反过来又阻止了真正的库文件夹被复制。
Any ideas?
有任何想法吗?
Best regards Chris
最好的问候克里斯
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:
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
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?
另一个有趣的方面是,在“库”面板的帮助菜单中,没有明确提及将文件夹视为库。有没有可能,Netbeans 中的按钮被错误命名,只允许使用真正的 jar?
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?!
b) 将资源文件夹添加到库列表确实会产生影响,将另一个条目添加到 MANIFEST.MF。虽然 - 这是较小的问题 - 类路径条目似乎总是期望资源文件夹是库文件夹(例如“lib/arts”)的子文件夹,但主要问题是似乎缺少斜线。如前所述,在 MANIFEST.MF 中 NB 生成的条目看起来像这个“lib/arts”(这对我不起作用),而(手动设置)“lib/arts/”呢?!
The way I use resources from the folder is something like this:
我使用文件夹中资源的方式是这样的:
URL resource = getClass().getResource("/gui/refresh.png");
ImageIcon tmp = new ImageIcon(resource);
Edit:
编辑:
Based on Tushars comment and this postingI found the following solution to be an acceptable tradeoff between functionality and comfort.
根据 Tushars 的评论和这篇文章,我发现以下解决方案是功能性和舒适性之间可接受的权衡。
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:
我从自动生成的“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>
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
权衡是为了在 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.
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.
这种行为是 - afaik - 旨在(强制将所有东西都捆绑在一个罐子里),即使有关于它的讨论正在进行中。要制作真正的分发包,我必须从 NB 的库列表中删除资源文件夹并重建。
Ideas about a more streamlined setup without any tradeoffs are of course still welcome. :)
当然,我们仍然欢迎有关更简化设置而不进行任何权衡的想法。:)
采纳答案by Tushar Joshi
Adding resource folder to classpath:
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.
Including the arts resource folder in the distribution
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.
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>
Code to access such resources:
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);
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
将资源文件夹添加到类路径:
当您清理并构建基于 NetBeans Ant 的项目时,它会在项目的根目录中创建一个 manifest.mf 文件。该文件也包含在 JAR 文件中。修改此文件并添加如下条目:
Manifest-Version: 1.0 X-COMMENT: Main-Class will be added automatically by build Class-Path: 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>
访问此类资源的代码:
访问此类资源文件所需的代码如下:(这在设计时不起作用,但肯定来自 JAR 文件)
// pay attention to relative path URL resource = ClassLoader.getSystemResource("gui/refresh.png"); ImageIcon tmp = new ImageIcon(resource);
注意:位于项目根目录中的文件 manifest.mf 和 build.xml 可从 NetBeans IDE 的“文件”面板访问
回答by eml
In order to remove the lib/art from Class-Path and not get "is a directory or can't be read" need delete lib/art from 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>
回答by Squiggler
Using NetBeans 8.0.2:
使用 NetBeans 8.0.2:
- Right-click the project.
- Select Properties.
- Select Sources.
- Click Add Folderfor the Source Package Folders.
- Select the the directory where the resources exist.
- Click Openon the directory name.
- Click OKto close the Project Propertiesdialog.
- 右键单击该项目。
- 选择属性。
- 选择来源。
- 单击“源包文件夹”的“添加文件夹”。
- 选择资源所在的目录。
- 单击目录名称上的打开。
- 单击“确定”关闭“项目属性”对话框。
The resources are added to the project.
资源被添加到项目中。
You'll see the directory added in your Navigation pane as well
您还将在导航窗格中看到添加的目录
In the other project, the resources are now available. For example, to read an image:
在另一个项目中,资源现在可用。例如,要读取图像:
BufferedImage zero = ImageIO.read(OCR.class.getResourceAsStream("/0.bmp"));