[英]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.