我希望有人能给我一个建议......
问题
在我的项目的源目录中,某些包包含的资源不是“.java”文件。现在我需要在那里编译“.class”文件。问题是当我构建最终的JAR时,ANT会过滤掉它们。 “.dll”和“.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包中)?因为我想相对于辅助Java类引用它们:
org.example.swt_jars\
swt_linux_32\
swt_linux_64\
swt_win_32\
swt_win_64\
SWTJarsResources.java
谢谢!
答案 0 :(得分:1)
Javac是一个编译器;让它移动文件是使用错误的工具。
我建议您在<javac>
任务之前或之后直接使用Ant copy task来移动现有的类文件。类似的东西:
<copy todir="${temp}">
<fileset dir="${src}">
<include name="**/*.class" />
</fileset>
</copy>
EDIT :你真正想要做的就是让Eclipse复制文件,但要让它识别出有需要引用的类。因此,我最先尝试的最简单的方法是将您的src
目录标记为包含类的位置以及包含源的。
我不知道这是否适用于Eclipse - 例如,IDEA不会让文件夹以这种方式充当双重用途。而且,它似乎不是适合这项工作的正确工具,因为IDE构建只是整理运行应用程序所需的二进制文件,并且基于某些项目设置复制文件似乎错误不知何故。
最终,我不认为你的设计是最干净的,与源文件混合的类可能会让人感到困惑。我很欣赏你这样做是因为你想使用相对引用,但也许你应该从文件系统本身抽象出来并使用Classloader.findResource()(或者可能是getResourceAsStream()
)。这样你就可以根据需要安排文件,只要你在类路径上运行你的应用程序和两个目录,Java就能找到你所追求的资源。这将为您提供更大的灵活性,以及解决这种特殊情况。