我希望有人能给我一个建议。。。
问题
在我项目的源目录中,有些包包含的资源不是".java"-文件。现在我需要把编译后的".class"-文件放在那里。问题是,当我构建最终的JAR时,ANT会过滤掉它们。".dll"one_answers".png"文件不会被过滤掉。
如何实现将所有内容复制到目标目录?
我使用以下Ant任务:
<javac srcdir="${src}" destdir="${temp}" target="1.5" encoding="8859_1" debug="${compile.withdebug}" >
<classpath refid="libs_path" />
</javac>
背景
我不得不在最后的JAR中放入多个其他依赖于操作系统的JAR(SWT发行版)。在程序启动时只加载一个JAR。但是,如果没有任何特殊的类加载器,就不可能让JVM从JAR加载JAR。因此,我将所有JAR提取到一个包中,JVM现在就可以加载它们了。
为什么我想把它们放在源代码下(Java包中)?因为我想将它们相对于helper Java类引用:
org.example.swt_jars
swt_linux_32
swt_linux_64
swt_win_32
swt_win_64
SWTJarsResources.java
谢谢!
Javac是一个编译器;让它四处移动文件是使用了错误的工具。
我建议简单地在<javac>
任务之前或之后直接使用Ant复制任务来移动现有的类文件。类似于:
<copy todir="${temp}">
<fileset dir="${src}">
<include name="**/*.class" />
</fileset>
</copy>
EDITfor Eclipse:您在这里真正想做的不是让Eclipse复制文件,而是让它识别出其中有需要引用的类。因此,最简单的方法也是我首先尝试的方法是将src
目录标记为包含类和包含源的的位置。
我不知道这是否适用于Eclipse——例如,IDEA不允许文件夹以这种方式兼用。再说一遍,它似乎不是一个合适的工具,因为IDE构建只是整理运行应用程序所需的二进制文件,而基于一些项目设置复制文件似乎是错误的。
最终,我不认为您的设计是最干净的,将类与源文件混合可能会令人困惑。我很感激您这样做是因为您想使用相对引用,但也许您应该从文件系统本身中抽象出来,并使用Classloader.findResource()(或者可能是getResourceAsStream()
)。通过这种方式,您可以随心所欲地排列文件,只要您在类路径上同时使用两个目录运行应用程序,Java就能够找到您想要的资源。这将给你更多的灵活性,以及解决这个特殊的情况。