簡體   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