代码之家  ›  专栏  ›  技术社区  ›  Steve Perkins

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

  •  8
  • Steve Perkins  · 技术社区  · 15 年前

    我在NetBeans中启动了一个新的Maven项目,接受所有的默认值。POM去掉了所有JAR依赖项,被剪切粘贴在这个问题的底部。

    应用程序读取各种属性文件(例如日志和配置)。它还读取外部资源,如字体、图像和声音。我不希望所有这些资源都被打包到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(或命令行)执行“clean and build”或“exec”时。。。我是什么 事实上 看起来像这样:

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

    其他 太棒了!(即获取资源 进入之内 一个罐子而不是保存它们 外面的 )

    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>
        ...
    
    4 回复  |  直到 15 年前
        1
  •  11
  •   informatik01 Viswanath Lekshmanan    12 年前

    虽然提出的解决方案可以工作,但它们基本上是围绕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>
    

    这将有效地将它们从罐子中排除,而无需任何解决方法。

    Here 是jar插件的文档页。

    尽管以上将回答你的问题,我可以建议一些额外的可能性,可以帮助你的努力。作为第二步,要使这些资源仍然可用,可以使用 assembly 插件。这将允许您创建一个zip文件,并将所有文件、资源和jar放在一个适当的位置,以便在解压缩zip时,所有东西都能放在适当的位置。

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

        2
  •  6
  •   Pascal Thivent    15 年前

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

    <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方式,所以我不会详细介绍。

    资源

        3
  •  0
  •   Eugene Kuleshov    15 年前

    你可以想象一下 resources:copy-resources 目标。

        4
  •  0
  •   jgifford25    15 年前

    应该是这样的:

    <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> 要素 here .

    你可以找到更多关于jar插件的信息 here

    你可以找到更多关于 <resource> 要素 here .

    here . 这应该会提高编译时间。在运行测试用例时,也可以告诉surefire使用1.4jdk执行。

    推荐文章