Maven原型插件不允许原型资源中的.resources通过

Posted

技术标签:

【中文标题】Maven原型插件不允许原型资源中的.resources通过【英文标题】:Maven archetype plugin doesn't let .resources in archetype-resources through 【发布时间】:2011-11-02 13:22:27 【问题描述】:

如何使.gitignore 等资源成为最终项目的一部分?

    archetype-resources/.gitignore创建原型 mvn install mvn archetype:generate 生成的项目不包含.gitignore

PS。我确定它不存在。

【问题讨论】:

这里所有的解决方案,只解决了一半的问题。他们使用.gitignore 构建了原型:但是您如何使用.gitignore 生成? 每个版本的行为都发生了变化,并且其中一项或多项调整都奏效了,这真是太好了。寻找具有最新插件版本的完整解决方案。 可以在Github#fortybits/a-bit-of-archetype找到重现和解决我正在尝试的问题的示例项目 【参考方案1】:

该错误似乎仍然存在于 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”

【讨论】:

非常感谢!...请注意,这是双倍的_ :) 虽然我可以看到__gitignore__ 文件是用最新版本的原型复制的,但该文件没有被 maven 重命名。 非常感谢!这是完美的解决方法 好吧,我会被诅咒的。人们会期望像 .gitignore 出现在生成的项目中这样简单的事情会被授予,但到 2021 年仍然没有。谢谢,这实际上工作得很好。【参考方案2】:

https://issues.apache.org/jira/browse/MRESOURCES-190 即将推出的 maven-resources-plugin v3.0.0(发布时尚未发布;当前仍然是 2.7)的解决方案似乎比阻止版本升级更好:

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

【讨论】:

我可以使用“addDefaultExcludes”来确认它是否有效。使用原型 2.4 和 maven-resources-plugin v.3.0.1 仍然有同样的问题。 addDefaultExcludes 工作正常,如此处所述。终于! src/main/resources/META-INF/maven/archetype-metadata.xml 中的文件集条目仍然需要。见:***.com/a/8909897/3165190【参考方案3】:

fileSet 条目添加到src/main/resources/META-INF/maven/archetype-metadata.xml 并带有一个空目录标签:

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

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

【讨论】:

【参考方案4】:

通过在调试时启动 Maven 构建(使用 -X 选项)检查您的 maven-resources-plugin 版本。如果你使用 2.7,there is a regression where .gitignore files are silently ignored。

在这种情况下,您必须在 pom.xml 中明确使用 2.6:

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

【讨论】:

【参考方案5】:

ARCHETYPE/issues/ARCHETYPE-505 表明,当前版本的插件和 maven 彻底打破了这一点。没有解决方法对此有帮助。

【讨论】:

【参考方案6】:

对我来说完美的解决方案是使用原型安装后 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 版本或其他任何提供更好的东西洞察你的答案。 对于maven-archetype-plugin 3.2.0 和maven-resources-plugin 3.2.0,原始答案中的问题再次出现。以前的解决方法 (&lt;addDefaultExcludes&gt;false&lt;/addDefaultExcludes&gt;) 不起作用,但 META-INF/archetype-post-generate.groovy 的解决方案对我来说非常有效! 这对我也有用。可能值得指定的是,要使其工作,模板项目中的.gitignore 文件也必须重命名为.gitignore.tmpl,与此解决方案中指定的&lt;include/&gt; 属性的值匹配。事后看来可能很明显,但我花了一段时间才弄清楚。【参考方案7】:

降级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>

【讨论】:

【参考方案8】:

该错误仍在最新的 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 的solution 更好,因为它不涉及使用旧插件。

以上是关于Maven原型插件不允许原型资源中的.resources通过的主要内容,如果未能解决你的问题,请参考以下文章

Maven基础-02-笔记

Maven基础-02-笔记

Maven基础-02-笔记

spring配置加载maven项目里面的src/main/resoures下的静态资源,配置路径是file:

mvn 原型:生成问题

Maven webapp原型不创建java文件夹