Maven原型插件不允许archetype-resources中的.resources文件通过。

37

如何使像 .gitignore 这样的资源成为生成项目的一部分?

  1. 创建包含 archetype-resources/.gitignore 的原型。
  2. mvn install
  3. mvn archetype:generate
  4. 生成的项目中不包含 .gitignore

注:我确定它不存在。


这里的所有解决方案只解决了问题的一半。它们构建了原型,并带有.gitignore:但是如何使用.gitignore生成呢? - flungo
每个版本的行为都有所改变,或者其他调整都起了作用,这真是太棒了。正在寻找最新插件版本的完整解决方案。 - Naman
1
可以在Github#fortybits/a-bit-of-archetype找到一个示例项目,以重现和解决我正在尝试的问题。 - Naman
9个回答

38

这个 bug 似乎仍然存在于 maven-archetype-plugin v3.0.1 中。对于那些不想降级 maven-resource-plugin 的人,我设法建立了一个更或多或少丑陋的解决方法。

首先,你需要将 archetype-resources/.gitignore 重命名为

__gitignore__

然后在 archetype-metadata.xml 文件中添加如下内容:

<requiredProperties>
    <requiredProperty key="gitignore">
        <defaultValue>.gitignore</defaultValue>
    </requiredProperty>
</requiredProperties>

<fileSets>
    <fileSet>
        <directory></directory>
        <includes>
            <include>__gitignore__</include>
        </includes>
    </fileSet>
</fileSets>
当原型被生成时,Maven 现在会先复制 __gitignore__,然后看到 __[file]__ 语法,并将其替换为默认值 ".gitignore"。

1
太棒了,谢谢!提醒大家是双下划线 __ :) - xbmono
尽管我能看到__gitignore__文件被复制到了原型的最新版本中,但是该文件并没有被Maven重命名。 - Naman
太棒了,谢谢!这是完美的解决方法。 - Pasindu
1
哎呀,真是让人惊讶。人们本以为像.gitignore这样简单的东西会出现在生成的项目中,但截至2021年,它仍未被授予。谢谢,这实际上完美地解决了问题。 - CarlosGoncalves
1
我想补充一下,对于那些不想要具有默认值的必需属性(即,用户不会根据他们用于此的界面受到提示),您可以尝试在模板中添加 #set( $gitignore = ".gitignore" ) (在我的情况下,我使用了 pom.xml)。 - snydergd

22

这个针对即将发布的maven-resources-plugin v3.0.0(在发表时尚未发布;当前版本仍为2.7)的解决方案来自https://issues.apache.org/jira/browse/MRESOURCES-190,似乎比阻止版本升级更好:

<build>
  <plugins>
    <plugin>
       <groupId>org.apache.maven.plugins</groupId>
       <artifactId>maven-resources-plugin</artifactId>
       <configuration>
          <!-- Required so that .gitignore gets included in archetypes; see https://issues.apache.org/jira/browse/MRESOURCES-190 -->
          <addDefaultExcludes>false</addDefaultExcludes>

1
我可以确认使用“addDefaultExcludes”是有效的。使用原型2.4和maven-resources-plugin v.3.0.1仍然存在相同的问题。 - max
addDefaultExcludes按照描述的方式正常工作。终于! - seba.wagner
1
src/main/resources/META-INF/maven/archetype-metadata.xml 中的文件集条目仍然是必需的。请参见:https://dev59.com/Bmsz5IYBdhLWcg3wVGEy#8909897 - Falko Menge

13

src/main/resources/META-INF/maven/archetype-metadata.xml 中添加一个 fileSet 条目,并使用空的目录标签:

<fileSet>
  <directory></directory>
  <includes>
    <include>.gitignore</include>
  </includes>
</fileSet>

这将把src/main/resources/archetype-resources中包含的文件复制到项目根目录。


9

启动Maven构建时,在调试模式下检查您的maven-resources-plugin版本(使用-X选项)。如果使用的是2.7版本,则会发生一个回归问题,即.gitignore文件会被静默忽略

在这种情况下,您需要在pom.xml中明确使用2.6版本:

<build>
    <pluginManagement>
        <plugins>
            <plugin>
                <artifactId>maven-resources-plugin</artifactId>
                <version>2.6</version>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

7

ARCHETYPE/issues/ARCHETYPE-505显示这在目前插件和Maven的版本中已经彻底失效。无法再通过任何解决方法来解决此问题。


3

在寻找解决方案时,查看了maven-archetype-plugin的常见问题解答部分,显然,版本3.2.1支持这种情况,即我们现在可以包含.gitignore。 为此,需要配置maven-resourcesmaven-archtype-plugin

<plugins>
    <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <configuration>
            <addDefaultExcludes>false</addDefaultExcludes>
        </configuration>
    </plugin>
    <plugin>
        <artifactId>maven-archetype-plugin</artifactId>
        <configuration>
            <useDefaultExcludes>false</useDefaultExcludes>
        </configuration>
    </plugin>
</plugins>

注意:我使用了版本为3.3.0的maven-resources-plugin和版本为3.2.1的maven-archetype-plugin。

来源: https://maven.apache.org/archetype/maven-archetype-plugin/faq.html#excludes


这对我解决了问题,谢谢。具体来说,我只需要配置maven-archetype-plugin(3.2.1)。 - Erik Vesterlund

2
对我来说完美的解决方案是使用原型后安装Groovy脚本。在原型项目的资源文件夹中创建一个文件META-INF/archetype-post-generate.groovy。添加以下代码:
file = new File( request.getOutputDirectory(), request.getArtifactId()+"/.gitignore.tmpl" );
def gitIgnorefile = new File( request.getOutputDirectory(), request.getArtifactId()+"/.gitignore" );
file.renameTo(gitIgnorefile)

在你的archetype-metadata.xml文件中,包含模板.gitignore.tmpl文件。
        <fileSet>
            <directory/>
            <includes>
                <include>.gitignore.tmpl</include>
            </includes>
        </fileSet>

我遇到了Maven资源插件的问题,因此使用了Groovy脚本解决方案。


这个问题很久以前就被问过了,而且Maven版本可能已经不同了,或者还有其他问题。请尽量详细地解释你的答案,比如添加Maven版本或任何其他能提供更好洞察力的东西。 - Sahil
原始答案中的问题对于maven-archetype-plugin 3.2.0和maven-resources-plugin 3.2.0再次实际存在。以前的解决方法(<addDefaultExcludes> false </ addDefaultExcludes>)不起作用,但是使用META-INF / archetype-post-generate.groovy的解决方案对我完美地起作用了! - Ivan Ponomarev
这对我也起作用了。值得指出的是,为了使此方法起作用,模板项目中的.gitignore文件也必须重命名为.gitignore.tmpl,以匹配此解决方案中指定的<include/>属性的值。或许事后看来很明显,但我花了一些时间才弄清楚。 - Tom

0

这个问题仍然存在于最新的maven-archetype-plugin 2.4和maven-resources-plugin 3.0.1中。

以下是解决方案:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-archetype-plugin</artifactId>
    <version>2.2</version>
</plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
 </plugin>

在你的生成的pom.xml文件中,你应该添加以下内容

 <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.6</version>
 </plugin>

vorburger的解决方案更好,因为它不涉及使用旧插件。 - Olivier Cailloux

0

降级 maven-resources-plugin 的替代方法是强制使用 plexus-utils 版本,但实际上这会导致一个回归问题:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.7</version>
    <dependencies>
        <!-- it's for fixing maven-resources-plugin 2.7 MRESOURCES-190 -->
        <dependency>
            <groupId>org.codehaus.plexus</groupId>
            <artifactId>plexus-utils</artifactId>
            <!-- this is last 2.x release -->
            <version>2.1</version>
        </dependency>
    </dependencies>
</plugin>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接