繁体   English   中英

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

[英]Having Maven2 copy resources to the build directory, but NOT bundle them in the 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中:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>steveperkins</groupId>
    <artifactId>myproject</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0</version>
    <name>My Project</name>
    <url>http://maven.apache.org</url>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.4</source>
                    <target>1.4</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
    ...

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

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <excludes>
                            <exclude>/conf/**</exclude>
                            <exclude>/fonts/**</exclude>
                            <exclude>/images/**</exclude>
                            <exclude>/sounds/**</exclude>
                        </excludes>
                    </configuration>
                </execution>
            </executions>
        </plugin>
   </plugins>
</build>

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

是jar插件的doc页面。

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

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

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

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

<project>
  ...
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.4.3</version>
        <executions>
          <execution>
            <id>copy-resources</id>
            <!-- here the phase you need -->
            <phase>validate</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <outputDirectory>${basedir}/target</outputDirectory>
              <resources>          
                <resource>
                  <directory>src/non-packaged-resources</directory>
                  <filtering>true</filtering>
                </resource>
              </resources>              
            </configuration>            
          </execution>
        </executions>
      </plugin>
    </plugins>
    ...
  </build>
  ...
</project>

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

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

资源

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

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

它应该看起来像这样:

<build>
  <outputDirectory>target/${artifactId}-${version}</outputDirectory>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>2.3.1</version>
      <configuration>
        <classesDirectory>${project.build.outputDirectory}</classesDirectory>
        <outputDirector>target</outputDirectory>
      </configuration>
    </plugin>
  </plugins>
  <resources>
    <resource>
      <directory>src/main/resources/conf</directory>
      <targetPath>../conf</targetPath>
    </resource>
    <resource>
      <directory>src/main/resources/ANOTHER_PATH</directory>
      <targetPath>../ANOTHER_PATH</targetPath>
    </resource>
  </resources>
</build>

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM