安装使用mvn archetype创建的多模块原型时出错:create-from-project

时间:2011-12-22 20:11:40

标签: maven archetypes

我有一个具有以下结构的项目:

项目(pom)
project-client(模块,jar)
project-ejb(module,jar)
project-web(模块,战争)
项目 - 耳朵(模块,耳朵)

在pom内部,模块使用以下方式引用父级:

<relativePath>../project</relativePath>

根pom以相同的方式引用模块(使用../).

我可以使用archetype创建一个原型:create-from-project,一切运行顺畅。

但是当我尝试安装archetype(mvn install在target / generated-sources / archetype dir中)时,我收到错误:

    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:2.2:integration-test (default-integration-test) on project seguranca-archetype:
    [ERROR] Archetype IT 'basic' failed: org.apache.maven.archetype.exception.ArchetypeGenerationFailure: Error merging velocity templates: Unable to find resource 'archetype-resources/../__rootArtifactId__-client/pom.xml'
    [ERROR] -> [Help 1]
    org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:2.2:integration-test (default-integration-test) on project seguranca-archetype: 
    Archetype IT 'basic' failed: org.apache.maven.archetype.exception.ArchetypeGenerationFailure: Error merging velocity templates: Unable to find resource 'archetype-resources/../__rootArtifactId__-client/pom.xml'
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
        at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
        at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
        at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:319)
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
        at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
        at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
        at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:616)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
        at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
        at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
        at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
    Caused by: org.apache.maven.plugin.MojoExecutionException: 
    Archetype IT 'basic' failed: org.apache.maven.archetype.exception.ArchetypeGenerationFailure: Error merging velocity templates: Unable to find resource 'archetype-resources/../__rootArtifactId__-client/pom.xml'
        at org.apache.maven.archetype.mojos.IntegrationTestMojo.execute(IntegrationTestMojo.java:268)
        at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
        at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
        ... 19 more

问题是该文件存在(它位于target / generated-sources / archetype / src / main / resources / __ rootArtifactId__client / pom.xml),我试图摆弄archetype-metadata.xml但没有成功。有线索吗?

提前致谢

3 个答案:

答案 0 :(得分:1)

看起来archetype插件不支持多模块项目的平面布局。如果是这种情况,则解决方法是更改​​为嵌套布局。我是通过将archetype-resources目录之外的模块移入其中来实现的。像这样:

在:

pom.xml
src
├── main
│   └── resources
│       ├── archetype-resources
│       │   └── pom.xml
│       ├── META-INF
│       │   └── maven
│       │       └── archetype-metadata.xml
│       ├── __rootArtifactId__.module1
│       │   ├── pom.xml
│       │   └── ...
│       ├── __rootArtifactId__.module2
│       │   ├── pom.xml
│       │   └── ...
│       ├── __rootArtifactId__.module3
│           ├── pom.xml
│           └── ...
│
└── test
    └── resources
        └── projects...

后:

pom.xml
src
├── main
│   └── resources
│       ├── archetype-resources
│       │   ├── pom.xml
│       │   ├── __rootArtifactId__.module1
│       │   │   ├── pom.xml
│       │   │   └── ...
│       │   ├── __rootArtifactId__.module2
│       │   │   ├── pom.xml
│       │   │   └── ...
│       │   └── __rootArtifactId__.module3
│       │       ├── pom.xml
│       │       └── ...
│       └── META-INF
│           └── maven
│               └── archetype-metadata.xml
└── test
    └── resources
        └── projects...

然后编辑对archetype-metadata.xml中模块的任何引用,删除&#39; ..&#39;相对路径。

答案 1 :(得分:0)

Maven Archetype JIRA中存在类似的问题:http://jira.codehaus.org/browse/ARCHETYPE-422

在撰写本文时,它仍然是开放的。

为了获得我的项目的工作原型,我采用了jboss-javaee6-webapp-ear-blank-archetype-7.1.3.CR1.jar并使用它生成了一个项目。然后我修改了项目以删除许多特定于jboss的项目,因为我们使用的是WebSphere。在这些修改之后,我运行了来自项目的创建:

mvn clean archetype:create-from-project -Dinteractive=true

我修改了archetype.groupId和archetype.artifactId以设置我希望原型最终在存储库中的位置及其名称。我还修改了包值,但接受其他项的默认值。

就像你经历的那样,这似乎运行良好。当我cd到\ target \ generated-sources \ archetype并运行mvn install时,将使用适当的路径和名称创建jar文件。

然后我使用Eclipse生成一个项目,这也很好。太好了吧?

因此,我做了一些小的更改,以更具体地了解我们的环境,并使用相同的组和工件ID执行上述步骤。然后我使用Eclipse生成一个项目,它给出了错误:

org.apache.maven.archetype.exception.ArchetypeGenerationFailure: Error merging velocity templates: Unable to find resource 'archetype-resources/pom.xml'

(我不会在mvn archetype:generate的命令行上始终得到相同的错误,但我已经看到它发生了。)

出于某种原因,在从项目创建时,再次执行这些步骤并输入不同的archetype.artifactId可以解决此问题。当原型更新为m2e不喜欢时,似乎会出现损坏或更改的内容。

无论如何,这可能值得一试。我将看看是否可以缩小问题范围,但是现在我将为每次更新使用唯一的artifactIds。

答案 2 :(得分:0)

只有在使用Eclipse m2e插件时才会出现问题。 我能够使用以下命令行解决问题:

mvn archetype:generate