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

Ste*_*ins 8 java maven-2 netbeans

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

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

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

-src
   |---main
           |---java
                   |---com.mypackage, etc
           |---resources
                        |---conf
                        |---fonts
                        |---images
                        |---sounds
+target
Run Code Online (Sandbox Code Playgroud)

我会喜欢一个干净的构建是这样以后有:

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

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

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

有人能指出我正确的方向获得第一个结果而不是第二个结果吗?如果这是一个愚蠢的问题(我是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>
    ...
Run Code Online (Sandbox Code Playgroud)

New*_*ian 11

虽然提出的解决方案可行,但它们基本上围绕着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>
Run Code Online (Sandbox Code Playgroud)

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

是jar插件的doc页面.

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

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

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


Pas*_*ent 6

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

<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>
Run Code Online (Sandbox Code Playgroud)

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

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

资源