6

为了让我的生活更轻松,我将我的 maven 配置为将我部署的应用程序放在/deploy与默认文件夹不同的文件夹 ( ) 中(因此它不会与classes/,surefire-reports目录等混合)。它工作正常,除了当我尝试运行mvn clean时,它只删除 jar 和复制的依赖项,而不是复制的资源。

更新看来它们正在被删除,但随后立即被放回。它似乎与使用 Eclipse 和 相关Build Automatically,但我不确定为什么更改 Maven 的配置会对 Eclipse 产生这种影响。结束更新

更新 2目前,没有一个答案是正确的。这个问题显然与目录无关deploy;似乎maven-resources-plugin使 Eclipse 复制资源作为Build Automatically的一部分。但是我不确定如何在不停止使用maven-resources-plugin 的情况下关闭它,并且在不停止使用Build Automatically的情况下,我会将赏金提供给能够解释如何执行此操作的人。结束更新 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>
4

7 回答 7

7

坚持 Maven 方式并将您的deploy目录放在下面,${basedir}/target然后您的问题将自行解决。您也可以删除干净插件的自定义插件配置。

于 2013-08-29T13:14:00.117 回答
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 项目的配置文件设置中

于 2013-09-04T17:35:24.060 回答
2

在你的位置,我会坚持“Maven 方式”。如果您想要一个只存储您的 jar 的地方,请执行mvn install并参考~/.m2/repository/groupId/artifactId,如果您希望您的 jar 包含其配置文件和/或依赖项,请使用Maven Assembly 插件

请注意,Eclipse 的自动重建也使用默认配置进行。就我个人而言,我让 Eclipse 以它想要的方式处理其工作区,并在单独的签出或通过Jenkins的方式执行命令行构建。

于 2013-08-30T13:54:39.317 回答
1

您的问题在带有资源的示例项目中重现。Run As -> Maven Clean 有后面提到的输出,它只涵盖了清理。

尽管最新版本不提供此屏幕,但我猜目标process-resources仍在运行,它将在运行任何 Maven 任务时将资源复制到您的输出目录。

我想知道为什么当 Sonatype 书中提到它时,插件仍然没有显示这些选项。

在我以前的项目中,我们曾经在更新项目配置时process-resources从目标中删除运行,以避免资源处理,因为主要任务是从命令行处理的。

希望这可以帮助。

PS:我认为您的问题与您更改部署目录无关。

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: sun.misc.Launcher$AppClassLoader@769fe666]
[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] ------------------------------------------------------------------------
于 2013-09-01T11:24:34.997 回答
1

它工作正常,除了当我尝试运行 mvn clean 时,它只删除 jar 和复制的依赖项,而不是复制的资源。

我意识到这是一个较老的问题,但这是我在调查 OP 遇到的同一问题时发现的第一个问题。这是为从事类似文学研究的其他任何人提供的明确答案,以了解为什么会观察到这种行为。

似乎它们正在被删除,但随后立即被放回

从命令行运行时,mvn clean通过删除target目录来删除所有构建工件。但是,当从 Eclipse 中运行时,它似乎target没有被删除。此外,如果定义了非默认资源,例如问题中提出的那些,它们似乎没有被删除。

这只是一种错觉,是两个不同任务的结果。首先,mvn clean删除整个target目录。第二个任务是Project → Build Automatically导致 M2E Builder 在完整和/或增量工作空间构建期间执行compiletest-compile阶段的结果。

这些阶段的先决条件是执行几个其他阶段,例如generate-resourcesprocess-resources(请参阅生命周期参考)。反过来,这些将导致资源目标的执行,例如由 OP 定义的资源目标。

自动构建的最终结果target是重新创建目录,其中包含:

  • OP 的自定义资源。
  • test-classes包含来自的编译代码和来自的src/test/java资源src/test/resources
  • test-classessrc/test/java分别包含来自和的编译代码和资源src/test/resources

Eclipse 不显示classestest-classes文件夹,因为它们被标记为输出文件夹(请参阅Properties → Java Build Path → Source)。但是由于OP的自定义资源不是输出目录,所以会显示出来,造成mvn clean不移除的错觉。

如果有疑问,可以通过禁用Project Explorer视图中的Customize View... → FiltersJava output folders下的选项来验证这一点。应该注意的是,此过滤选项在Package Explorer视图中不可用。更简单的验证是通过操作系统的控制台或文件资源管理器运行并检查项目目录的内容。mvn clean

最后,mvn clean从命令行运行,将验证它是否target按预期删除了目录;只有在 IDE 更改后 Eclipse 的自动构建启动后才会重新出现。通常,最好偶尔从命令行构建项目,以确保构建配置与 IDE 无关。

于 2017-04-04T01:33:47.507 回答
0

将以下文件集添加到 maven-clean-plugin 部分

<fileset>
    <directory>${basedir}/deploy/config</directory>
</fileset>
于 2013-08-29T00:28:03.523 回答
-1

它看起来像是Maven Builder从 Eclipse 中调用的,而 Eclipse 又再次填充文件。我想您可以尝试在 Eclipse 中为您的项目禁用 Maven 构建器和 Maven 特性,看看它是否能解决问题。

要禁用 Eclipse Maven 构建器,请转到

Eclipse Project Properties -> Builders -> Maven builder

禁用eclipse maven性质 在此处输入图像描述

我要说的是问题是由于eclipse-maven集成而不是maven

于 2013-09-03T11:52:30.933 回答