2013-08-26 55 views
5

爲了讓我的生活更輕鬆,我配置了我的maven,將我部署的應用程序放置在與默認不同的文件夾(/deploy)中(因此它不會與classes/,surefire-reports目錄等混用)向前)。它工作正常,除了當我嘗試運行mvn clean時,它只會刪除jar和複製的依賴關係,而不是複製的資源。Maven clean不會刪除複製的資源

UPDATE看起來他們正在被刪除,但後來立即放回。它似乎與使用Eclipse和Build Automatically有關,但我不確定爲什麼更改Maven的配置會對Eclipse產生這種影響。 結束時更新

更新2就目前而言,沒有一個答案是正確的。這個問題顯然與deploy目錄無關;似乎maven-resources-plugin使Eclipse複製資源成爲自動構建的一部分。但我不知道如何不停止使用maven-resources-plugin,並且不停止使用自動構建我會給予可以解釋如何做到這一點的人的賞金。 結束時更新2

無論如何,我的目錄看起來是這樣的:

my-app 
|-- pom.xml 
|-- src 
| |-- main 
| | |-- java 
| | `-- resources 
| |  |-- script.sh 
| |  `-- config 
| |   `-- app.properties 
| `-- test 
|  |-- java 
|  `-- resources 
`-- deploy 
    |-- my-app.jar <----- This gets deleted correctly 
    |-- lib  <----- This gets deleted correctly 
    | |-- dependency1.jar  <----- This gets deleted correctly 
    | |-- dependency2.jar  <----- This gets deleted correctly 
    |-- config  <----- This DOES NOT get deleted correctly 
    | `-- app.properties  <----- This DOES NOT get deleted correctly 
    `-- script.sh <----- This DOES NOT get deleted correctly 

這裏是我的pom片斷:

<plugin> 
    <artifactId>maven-jar-plugin</artifactId> 
    <version>${maven.jar.version}</version> 
    <configuration> 
     <archive> 
      <manifest> 
       <mainClass>my.main.Class</mainClass> 
       <packageName>my.main</packageName> 
       <addClasspath>true</addClasspath> 
       <classpathPrefix>lib/</classpathPrefix> 
      </manifest> 
     </archive> 
     <excludes> 
      <exclude><!-- the files I don't want in my jar --></exclude> 
     </excludes> 
     <outputDirectory>${basedir}/deploy</outputDirectory> 
    </configuration> 
</plugin> 
<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-dependency-plugin</artifactId> 
    <version>2.1</version> 
    <executions> 
     <execution> 
      <id>copy-dependencies</id> 
      <phase>package</phase> 
      <goals> 
       <goal>copy-dependencies</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${basedir}/deploy/lib</outputDirectory> 
       <includeScope>compile</includeScope> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
<plugin> 
    <artifactId>maven-resources-plugin</artifactId> 
    <version>2.6</version> 
    <executions> 
     <execution> 
      <id>copy-resources</id> 
      <phase>install</phase> 
      <goals> 
       <goal>copy-resources</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${basedir}/deploy</outputDirectory> 
       <resources> 
        <resource> 
         <directory>${basedir}/src/main/resources</directory> 
         <filtering>false</filtering> 
        </resource> 
       </resources> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 
<plugin> 
    <artifactId>maven-clean-plugin</artifactId> 
    <version>2.5</version> 
    <configuration> 
     <filesets> 
      <fileset> 
       <directory>deploy</directory> 
       <includes> 
        <include>**/*</include> 
       </includes> 
       <followSymlinks>false</followSymlinks> 
      </fileset> 
     </filesets> 
    </configuration> 
</plugin> 
+0

@Ben你爲什麼要刪除[tag:clean]標籤? – durron597

+2

因爲它不夠具體;有多少種語言具有「乾淨」功能等?它會被錯誤的原因使用它立即變得不堪重負。我想你可以添加一個'[maven-clean]'或'[mvn-clean]',但是請不要使用如此通用的東西。 – Ben

+1

這是如何更容易? –

回答

2

如果問題是how to disable eclipse to run specific plugin比您可以在默認情況下激活的特定配置文件中輸入

<project> 
    ... 
    <profiles> 
    <profile> 
     <id>not-eclipse</id> 
     <activation> 
     <activeByDefault>true</activeByDefault> 
     </activation> 
     <build> 
     <plugins> 
      <plugin> 
      <artifactId>maven-resources-plugin</artifactId> 
      <version>2.6</version> 
      ... 
     </plugins> 
     </build> 
    </profile> 
    ... 
</project> 

,並放置在! not-eclipse Eclipse項目的配置文件設置

+0

你能解釋一下你最後一部分的含義嗎?我不知道你在哪裏提到。 – durron597

+0

http://czetsuya-tech.blogspot.ru/2011/11/how-to-activate-maven-profile-inside.html#.UieA367249Q這裏的例子如何激活配置文件,使用'!'配置文件將被停用 –

+0

也,請查看http://wiki.eclipse.org/M2E_FAQ#How_to_configure_Maven_project_to_use_separate_output_folders_in_Eclipse –

0

下列文件集添加到Maven的清理插件部分

<fileset> 
    <directory>${basedir}/deploy/config</directory> 
</fileset> 
+0

我會嘗試,但它不會解決其他問題。看我上面的編輯到文件結構。 – durron597

7

堅持Maven的方式,並把你的deploy目錄下${basedir}/target然後你的問題將解決自己。您也可以刪除乾淨插件的自定義插件配置。

+1

好吧,我現在有了新的證據。 Maven在更改pom後清理CREATED配置和數據記錄器。也許我的複製資源的目標是錯誤的? – durron597

+1

對大家upvoting這個答案,這是行不通的 – durron597

+1

什麼是行不通的?我廣泛使用了這種方法。 –

2

在你的地方,我會堅持「Maven的方式」。如果你想要一個只有你的jar存儲的地方做mvn install並參考~/.m2/repository/groupId/artifactId,如果你想你的jar與它的配置文件和/或依賴關係使用Maven Assembly plugin打包。

請注意,Eclipse的自動重建也使用默認配置進行。就我個人而言,我讓Eclipse按照自己想要的方式處理其工作空間,並在單獨簽出或通過Jenkins的平臺執行命令行構建。

+0

查看我的更新。這不是問題 – durron597

+0

您正在使用哪個Eclipse版本? –

+0

開普勒。隨着嵌入式m2eclipse 3.0.4 – durron597

1

您的問題在具有資源的示例項目上重現。運行 - > Maven Clean具有後面提到的輸出,僅涵蓋清理。

雖然最新版本不提供這個screen,但我猜目標process-resources仍然運行,它會在運行任何Maven任務時將資源複製到輸出目錄。

我想知道爲什麼,當Sonatype書中提到它時,插件仍然沒有顯示這些選項。

在我的以前的項目,我們用來去除process-resources目標運行時更新項目配置以避免資源加工爲主要任務是從命令行處理。

希望這會有所幫助。

P.S:我不認爲你的問題與你改變部署目錄有什麼關係。

Apache Maven 3.0.4 (r1232337; 2012-01-17 14:14:56+0530) 
Maven home: C:\projects\workspace\abc\EMBEDDED 
Java version: 1.7.0_04, vendor: Oracle Corporation 
Java home: C:\Java\jre7 
Default locale: en_US, platform encoding: Cp1252 
OS name: "windows 7", version: "6.1", arch: "amd64", family: "windows" 
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder". 
SLF4J: Defaulting to no-operation (NOP) logger implementation 
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details. 
[INFO] Error stacktraces are turned on. 
[DEBUG] Reading global settings from EMBEDDED\conf\settings.xml 
[DEBUG] Reading user settings from C:\Users\stackoverflow\.m2\settings.xml 
[DEBUG] Using local repository at C:\Users\stackoverflow\.m2\repository 
[DEBUG] Using manager EnhancedLocalRepositoryManager with priority 10 for C:\Users\stackoverflow\.m2\repository 
[INFO] Scanning for projects... 
[DEBUG] Extension realms for project abc:abc:jar:0.0.1-SNAPSHOT: (none) 
[DEBUG] Looking up lifecyle mappings for packaging jar from ClassRealm[plexus.core, parent: null] 
[DEBUG] === REACTOR BUILD PLAN ================================================ 
[DEBUG] Project: abc:abc:jar:0.0.1-SNAPSHOT 
[DEBUG] Tasks: [clean] 
[DEBUG] Style: Regular 
[DEBUG] ======================================================================= 
[INFO]                   
[INFO] ------------------------------------------------------------------------ 
[INFO] Building Test 0.0.1-SNAPSHOT 
[INFO] ------------------------------------------------------------------------ 
[DEBUG] Lifecycle default -> [validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy] 
[DEBUG] Lifecycle clean -> [pre-clean, clean, post-clean] 
[DEBUG] Lifecycle site -> [pre-site, site, post-site, site-deploy] 
[DEBUG] Lifecycle default -> [validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy] 
[DEBUG] Lifecycle clean -> [pre-clean, clean, post-clean] 
[DEBUG] Lifecycle site -> [pre-site, site, post-site, site-deploy] 
[DEBUG] === PROJECT BUILD PLAN ================================================ 
[DEBUG] Project:  abc:abc:0.0.1-SNAPSHOT 
[DEBUG] Dependencies (collect): [] 
[DEBUG] Dependencies (resolve): [] 
[DEBUG] Repositories (dependencies): [central (http://repo.maven.apache.org/maven2, releases)] 
[DEBUG] Repositories (plugins)  : [central (http://repo.maven.apache.org/maven2, releases)] 
[DEBUG] ----------------------------------------------------------------------- 
[DEBUG] Goal:   org.apache.maven.plugins:maven-clean-plugin:2.4.1:clean (default-clean) 
[DEBUG] Style:   Regular 
[DEBUG] Configuration: <?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <directory default-value="${project.build.directory}"/> 
    <excludeDefaultDirectories default-value="false">${clean.excludeDefaultDirectories}</excludeDefaultDirectories> 
    <failOnError default-value="true">${maven.clean.failOnError}</failOnError> 
    <followSymLinks default-value="false">${clean.followSymLinks}</followSymLinks> 
    <outputDirectory default-value="${project.build.outputDirectory}"/> 
    <reportDirectory default-value="${project.reporting.outputDirectory}"/> 
    <skip default-value="false">${clean.skip}</skip> 
    <testOutputDirectory default-value="${project.build.testOutputDirectory}"/> 
    <verbose>${clean.verbose}</verbose> 
</configuration> 
[DEBUG] ======================================================================= 
[INFO] 
[INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ abc --- 
[DEBUG] Created new class realm maven.api 
[DEBUG] Importing foreign packages into class realm maven.api 
[DEBUG] Imported: org.apache.maven.wagon.events < plexus.core 
... 
Lots of such lines 
... 
[DEBUG] Imported: org.codehaus.plexus.* < plexus.core 
[DEBUG] Imported: org.codehaus.plexus.personality < plexus.core 
[DEBUG] Populating class realm maven.api 
[DEBUG] org.apache.maven.plugins:maven-clean-plugin:jar:2.4.1: 
[DEBUG] org.apache.maven:maven-plugin-api:jar:2.0.6:compile 
[DEBUG] org.codehaus.plexus:plexus-utils:jar:2.0.5:compile 
[DEBUG] Created new class realm plugin>org.apache.maven.plugins:maven-clean-plugin:2.4.1 
[DEBUG] Importing foreign packages into class realm plugin>org.apache.maven.plugins:maven-clean-plugin:2.4.1 
[DEBUG] Imported: < maven.api 
[DEBUG] Populating class realm plugin>org.apache.maven.plugins:maven-clean-plugin:2.4.1 
[DEBUG] Included: org.apache.maven.plugins:maven-clean-plugin:jar:2.4.1 
[DEBUG] Included: org.codehaus.plexus:plexus-utils:jar:2.0.5 
[DEBUG] Excluded: org.apache.maven:maven-plugin-api:jar:2.0.6 
[DEBUG] Configuring mojo org.apache.maven.plugins:maven-clean-plugin:2.4.1:clean from plugin realm ClassRealm[plugin>org.apache.maven.plugins:maven-clean-plugin:2.4.1, parent: [email protected]] 
[DEBUG] Configuring mojo 'org.apache.maven.plugins:maven-clean-plugin:2.4.1:clean' with basic configurator --> 
[DEBUG] (f) directory = C:\projects\rollbase2.0workspace\abc\target 
[DEBUG] (f) excludeDefaultDirectories = false 
[DEBUG] (f) failOnError = true 
[DEBUG] (f) followSymLinks = false 
[DEBUG] (f) outputDirectory = C:\projects\rollbase2.0workspace\abc\target\classes 
[DEBUG] (f) reportDirectory = C:\projects\rollbase2.0workspace\abc\target\site 
[DEBUG] (f) skip = false 
[DEBUG] (f) testOutputDirectory = C:\projects\rollbase2.0workspace\abc\target\test-classes 
[DEBUG] -- end configuration -- 
[DEBUG] Skipping non-existing directory C:\projects\rollbase2.0workspace\abc\target 
[DEBUG] Skipping non-existing directory C:\projects\rollbase2.0workspace\abc\target\classes 
[DEBUG] Skipping non-existing directory C:\projects\rollbase2.0workspace\abc\target\test-classes 
[DEBUG] Skipping non-existing directory C:\projects\rollbase2.0workspace\abc\target\site 
[INFO] ------------------------------------------------------------------------ 
[INFO] BUILD SUCCESS 
[INFO] ------------------------------------------------------------------------ 
[INFO] Total time: 1.693s 
[INFO] Finished at: Sun Sep 01 16:38:36 IST 2013 
[INFO] Final Memory: 4M/121M 
[INFO] ------------------------------------------------------------------------ 
+0

對於它的價值,這是唯一的答案,似乎是在正確的軌道上。不幸的是,這不是一個真正的「答案」,我不願意在這裏給予賞金,但肯定它是領跑者。 – durron597

+0

同意@ durron597。我的幾個朋友也經歷過同樣的麻煩。爲什麼插件的用戶界面與文檔有所不同。 – sErVerdevIL

-1

看起來Maven Builder正從Eclipse的,這是inturn再次填充文件調用。我想你可以嘗試在eclipse中爲你的項目禁用Maven builder和Maven nature,看看它是否能解決問題。

要禁用Eclipse中的Maven構建這個去

Eclipse Project Properties -> Builders -> Maven builder 

禁用日食Maven的性質 enter image description here

我要說的是問題是由於Eclipse的Maven的整合,而不是Maven的

+0

這可能會解決「問題」,但它也會打破所有其他問題。 – durron597

+0

打破什麼?也許我可以建議解決方案。 –

+0

如果我關閉Maven,那麼我將失去使用Maven的全部目的...... – durron597

1

它工作正常,只是當我嘗試運行mvn乾淨,只刪除罐子和複製的依賴,但不能複製的資源。

我意識到這是一個老問題,但這是我在調查OP所遇到的同一問題時發現的第一個問題。這是作爲一個明確的答案,爲誰從事類似文學研究至於爲什麼這種行爲是觀察。

看樣子他們都被刪除,但隨後立即得到

放回當在命令行中運行mvn clean刪除所有被刪除target目錄建立文物。但是,從Eclipse內運行時,看起來target未被刪除。此外,如果定義非默認資源,例如問題中提供的資源,看起來它們不會被刪除。

這只是一個錯覺,是兩個截然不同的任務的結果。第一個,mvn clean刪除整個target目錄。第二項任務是由於項目→自動構建導致M2E Builder執行完整和/或增量工作區構建期間的compiletest-compile階段。

這些階段的先決條件是執行其他幾個階段,例如generate-resourcesprocess-resources(請參閱Lifecycle Reference)。這反過來又會導致資源目標的執行,如由OP定義的資源目標。

的自動最終的結果是建立了target目錄重新創建包含:

  • OP的自定義資源。
  • test-classes含有選自分別src/test/javasrc/test/resources,編譯的代碼從src/test/java和資源從src/test/resources
  • test-classes含有編譯代碼和資源。

Eclipse不顯示classestest-classes文件夾,因爲它們被標記爲輸出文件夾(見屬性→ Java構建路徑→來源)。但是,由於OP的自定義資源不是輸出目錄,因此會顯示它們,導致mvn clean不會刪除它們。

如果有疑問,可以通過禁用在項目資源管理器視圖自定義視圖... →過濾器Java output folders選項驗證這一點。應該注意的是,此過濾選項在包資源管理器視圖中不可用。更簡單的驗證是運行mvn clean並通過操作系統的控制檯或文件資源管理器檢查項目目錄的內容。

最後,從命令行運行mvn clean,將驗證它確實刪除了target目錄;只有在Eclipse的自動構建在IDE更改後啓動後纔會重新出現。一般來說,從命令行中不時建立項目是一個好主意,以確保構建配置與IDE無關。

+0

我終於意識到這一點,雖然這對於閱讀這個問題的讀者來說非常有用,但它並沒有真正回答「我該怎麼做」如果我發現自己處在這種情況下「(不像我接受的答案) – durron597

+0

@ durron597感謝您的反饋。我確實意識到你在更新#2中改變了你的問題的焦點,這應該是一個新問題。我的回答的目標是解釋*標題*的問題及其原始描述,以及像我這樣做過的任何人的原始描述。我最擔心的是這是否被接受。 – Frelling