Chr*_*anS 16 java netbeans classpath
如何将文件夹(例如包含arts的资源文件夹)添加到netbeans项目的类路径中?我设法通过编辑项目的NB生成的jar文件(即MANIFEST.MF文件+手动复制资源)手动完成,但应该有一种方法告诉netbeans也要记住资源,不是吗?
文件夹结构如下所示:
/project/art/
/project/dist/lib/
/project/dist/art/
/project/dist/project.jar
/project/lib/
/project/src/
Run Code Online (Sandbox Code Playgroud)
我不想将艺术品装入罐子里,因为我希望这种艺术很容易交换.如果我将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
Run Code Online (Sandbox Code Playgroud)
另一个有趣的方面是,在"库"面板的"帮助"菜单中,没有明确提及有关文件夹的库.是否有可能,Netbeans中的按钮被错误地命名,只允许真正的jar?
b)将资源文件夹添加到Libraries列表确实会产生影响,即向MANIFEST.MF添加另一个条目.虽然 - 这是较小的问题 - 类路径条目似乎总是期望资源文件夹是库文件夹的子文件夹(例如"lib/arts"),主要问题是似乎缺少斜线.如上所述,MANIFEST.MF中NB生成的条目看起来像这个"lib/arts"(对我来说不起作用),而(手动设置)"lib/arts /"呢?
我使用文件夹中的资源的方式是这样的:
URL resource = getClass().getResource("/gui/refresh.png");
ImageIcon tmp = new ImageIcon(resource);
Run Code Online (Sandbox Code Playgroud)
编辑:
基于Tushars评论和这篇帖子,我发现以下解决方案是功能性和舒适性之间可接受的权衡.
我从自动生成的'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>
Run Code Online (Sandbox Code Playgroud)
权衡是,对于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.
Run Code Online (Sandbox Code Playgroud)
这种行为是 - afaik - 意图(迫使所有东西被捆绑在一个罐子里),即使有讨论正在进行.要制作一个真正的分发包,我必须从NB中的库列表中取出资源文件夹并重建.
关于更简化设置而没有任何权衡的想法当然仍然受欢迎.:)
Tus*_*shi 14
将资源文件夹添加到类路径:
清理 - 并 - 构建基于NetBeans Ant的项目时,它会在项目的根目录中创建manifest.mf文件.该文件也包含在JAR文件中.修改此文件并添加如下条目:
Manifest-Version: 1.0
X-COMMENT: Main-Class will be added automatically by build
Class-Path: arts/
Run Code Online (Sandbox Code Playgroud)
在课堂上的艺术之后,斜线很重要.
包括分发中的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>
Run Code Online (Sandbox Code Playgroud)访问此类资源的代码:
访问此类资源文件所需的代码如下:(这在设计时不起作用,但肯定来自JAR文件)
// pay attention to relative path
URL resource = ClassLoader.getSystemResource("gui/refresh.png");
ImageIcon tmp = new ImageIcon(resource);
Run Code Online (Sandbox Code Playgroud)
注意:位于项目根目录中的文件manifest.mf和build.xml可从NetBeans IDE中的"文件"面板访问
Squ*_*ler 10
使用NetBeans 8.0.2:
资源将添加到项目中.
您还会在导航窗格中看到添加的目录
在另一个项目中,资源现已可用.例如,要读取图像:
BufferedImage zero = ImageIO.read(OCR.class.getResourceAsStream("/0.bmp"));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
92418 次 |
| 最近记录: |