将Maven2复制资源到构建目录,但不将它们捆绑在JAR中

我在NetBeans中启动了一个新的Maven项目,接受了所有默认设置。 将所有JAR依赖关系剥离出来的POM在这个问题的底部被剪切粘贴。

应用程序读入各种属性文件(例如日志记录和配置)。 它还可读取字体,图像和声音等外部资源。 我不希望将所有这些资源捆绑到JAR文件中。 相反,我计划将它们部署在部署JAR的目录下的子目录中。

项目目录结构的简化视图如下所示:

-src |---main |---java |---com.mypackage, etc |---resources |---conf |---fonts |---images |---sounds +target 

干净的构建后我想要的是这样的:

 +src -target |---myproject-1.0.0.jar (compiled contents of "src/main/java" ONLY) |---conf |---fonts |---images |---sounds 

但是,当我通过NetBeans(或命令行)执行“清理并构建”或“执行”时……我实际得到的内容如下所示:

 +src -target |---classes |---("src/main/java" and "src/main/resources" slammed together) |---myproject-1.0.0.jar (the "classes" subdirectory JAR'ed up) 

有人能指出我正确的方向获得第一个结果而不是第二个结果吗? 如果这是一个愚蠢的问题(我是Maven新手),或者如果我忽略了以前要求的副本,我道歉。 但是,从我在Stack Overflow上的搜索开始……看起来所有重复的问题都试图走向另一个方向! (即将资源放入 JAR而不是将其保留)

pom.xml中:

  4.0.0 steveperkins myproject jar 1.0.0 My Project http://maven.apache.org    org.apache.maven.plugins maven-compiler-plugin 2.0.2  1.4 1.4      ... 

尽管提出的解决方案可行,但它们基本上围绕着maven惯例。 一个更好的选择是过滤掉资源,这样它们就不会包含在jar中,但在IDE中工作时仍然可以作为资源使用。 它应该看起来像这样:

    org.apache.maven.plugins maven-jar-plugin    jar    /conf/** /fonts/** /images/** /sounds/**        

这将有效地将它们从jar子中排除而没有任何变通方法。

这是jar插件的doc页面。

虽然以上将回答您的问题,但我可以建议一些额外的可能性,可以帮助您的努力。 作为第二步,仍然可以使这些资源可用,您可以使用程序集插件打包您的项目。 这将允许您创建一个zip文件并将所有文件,资源和jar放在适当的位置,以便在解压缩zip时,所有内容都会到位。

如果这个项目是一个大型工作的一部分你仍然可以使用程序集插件,你可能会遇到这种情况,在主项目中,你可以提取并重新组合它们在一个更大的zip包括所有必要的工件。

最后,我建议您将目录结构保留在目标下。 如果你自定义它,最好通过Maven变量来完成它,以便更改渗透到其他插件。 如果您在Maven完成后手动删除并重命名内容,则可能会在以后遇到问题。 通常情况下,如果您按照自己的方式配置它,Maven jar插件应该能够正确使用它,这样您就不必担心目标是什么了。 就个人而言,我使用Eclipse,并且pusign非常适合使IDE和Maven配置同步。 对于NetBeans,我怀疑这也是如此。 如果不是,最好的方法是在NetBeans中配置项目,以使用目标/类作为构建工件的目标文件夹,并将目标/测试类用于从src / test / java构建的内容。

就个人而言,我不会使用资源的默认位置,而是使用“额外”位置,并配置资源插件将它们从那里复制到您想要的位置:

  ...    maven-resources-plugin 2.4.3   copy-resources  validate  copy-resources   ${basedir}/target   src/non-packaged-resources true        ...  ...  

如果你坚持使用默认位置( src/main/resources ),我认为你必须配置一些排除(见下文)以避免资源被默认复制,然后使用与上面相同的方法。

另一种选择是使用AntRun maven插件和Ant来移动文件,但这不是真正的maven方式所以我不会详细说明。

资源

  • 复制资源
  • 包括和排除文件和目录

您可以声明特殊的资源执行:copy-resources目标。

Eugene走在正确的轨道上,但有更好的方法来完成这项工作。

它应该看起来像这样:

  target/${artifactId}-${version}   org.apache.maven.plugins maven-jar-plugin 2.3.1  ${project.build.outputDirectory} target      src/main/resources/conf ../conf   src/main/resources/ANOTHER_PATH ../ANOTHER_PATH    

你将无法摆脱’classes’目录,但你可以给它一个不应该干扰NetBeans的不同名称。

您可以在此处找到有关元素的更多信息。

你可以在这里找到关于jar插件的更多信息。

您可以在此处找到有关元素的更多信息。

作为旁注,您可能需要考虑在1.6 JDK下运行Maven并分叉maven-compiler-plugin以使用1.4 JDK进行编译。 你可以在这里找到更多相关信息。 这应该会促进你的编译时间。 您还可以在运行测试用例时告诉surefire以使用1.4 JDK执行。