Maven - “maven-archetype-simple”是一个有效的原型吗?

3
通常,我使用原型maven-archetype-quickstart创建Maven jar项目,这很有效。
但是我想创建没有示例App.java类的Maven项目,因此我尝试了原型maven-archetype-simple,但是遇到错误。
Maven命令: mvn archetype:generate -DgroupId=eric -DartifactId=hello -Dversion=0.1 -DarchetypeArtifactId=maven-archetype-simple -DinteractiveMode=false -X -DarchetypeCatalog=local 错误提示:
[ERROR] 无法执行目标 org.apache.maven.plugins:maven-archetype-plugin:2.4:generate (default-cli),在 standalone-pom 项目上:定义的 artifact 不是原型 -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: 无法执行目标 org.apache.maven.plugins:maven-archetype-plugin:2.4:generate (default-cli),在 standalone-pom 项目上:定义的 artifact 不是原型 at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:212) 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:116) at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80) at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307) at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193) at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106) at org.apache.maven.cli.MavenCli.execute(MavenCli.java:863) at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:288) at org.apache.maven.cli.MavenCli.main(MavenCli.java:199) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) Caused by: org.apache.maven.plugin.MojoFailureException: 定义的 artifact 不是原型 at org.apache.maven.archetype.mojos.CreateProjectFromArchetypeMojo.execute(CreateProjectFromArchetypeMojo.java:205) at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134) at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:207) ... 20 more Caused by: org.apache.maven.archetype.exception.ArchetypeGenerationConfigurationFailure: 定义的 artifact 不是原型 at org.apache.maven.archetype.ui.generation.DefaultArchetypeGenerationConfigurator.configureArchetype(DefaultArchetypeGenerationConfigurator.java:150) at org.apache.maven.archetype.mojos.CreateProjectFromArchetypeMojo.execute(CreateProjectFromArchetypeMojo.java:189) ... 22 more [ERROR] 更多错误和可能的解决方法,请阅读以下文章: [ERROR] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

问题如下:

3个回答

6
该工件maven-archetype-simple确实存在于Maven Central,但它不是一个有效的原型,因为它没有包含正确的元数据文件。一个有效的原型必须在其JAR文件中包含以下内容
  • 要么是META-INF/maven/archetype-metadata.xml(这是新格式);
  • 要么是META-INF/maven/archetype.xml甚至是META-INF/archetype.xml(这是旧格式)。

而且,由于特定的工件在中央存在,它没有这些文件。因此,它不被认为是插件的有效原型。这些文件存储原型所需的参数、可能的默认值、应使用的文件等等,因此它们确实是必需的。

我不确定是否存在一种原型,可以仅生成具有给定Maven坐标的单个pom.xml文件。这实际上是使用maven-archetype-quickstart,但不生成App.javaAppTest.java所做的事情。请记住,原型实际上旨在从预定义的模板创建项目,例如示例Java EE应用程序或示例Maven项目;所有这些都需要比编写POM文件更多的设置。
如果您真的非常不想要那些文件,您可以选择:

创建自己的原型

创建一个新的Maven项目,例如my-simple-archetype,并使用以下目录结构:
pom.xml
src
\---main
    \---resources
        +---archetype-resources
        |       pom.xml
        |
        \---META-INF
            \---maven
                    archetype-metadata.xml

根目录下 pom.xml 的内容:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>eric</groupId>
  <artifactId>my-simple-archetype</artifactId>
  <version>0.1</version>
  <packaging>maven-archetype</packaging>
  <build>
    <extensions>
      <extension>
        <groupId>org.apache.maven.archetype</groupId>
        <artifactId>archetype-packaging</artifactId>
        <version>2.4</version>
      </extension>
    </extensions>
    <pluginManagement>
      <plugins>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-archetype-plugin</artifactId>
          <version>2.4</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

src/main/resources/archetype-resources/pom.xml 的内容:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>${groupId}</groupId>
  <artifactId>${artifactId}</artifactId>
  <version>${version}</version>
</project>

最后,src/main/resources/META-INF/maven/archetype-metadata.xml的内容:

<archetype>
  <id>my-simple-archetype</id>
</archetype>

现在您可以构建此项目并安装它:
cd my-simple-archetype
mvn clean install

这将更新您的本地目录,以便可以使用此新原型。您最终可以使用它!在新目录中执行以下操作:
mvn archetype:generate -DgroupId=eric -DartifactId=hello -Dversion=0.1 -DarchetypeArtifactId=my-simple-archetype -DarchetypeGroupId=eric -DinteractiveMode=false

你将得到你想要的项目...它只包含一个孤立的pom.xml文件。因此,当然,你现在可以自定义你的原型

删除文件

或者你决定这不值得一试,删除这些文件会更加简单:

mvn archetype:generate -DgroupId=eric -DartifactId=hello -Dversion=0.1 -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
rmdir /S /Q hello\src

或者如果你在Linux机器上,执行rm -rf hello/src

1
很高兴看到关于创建自定义原型的示例。 - Eric
今天我遇到了同样的问题。提供一个你无法直接使用的原型听起来真的非常愚蠢。 - Floating Sunfish

1
关于maven-archetype-simple,即使它是有效的(事实并非如此),它也有点过时(2006年)。我建议您使用更新的内容,以便插件和Java版本不会太旧。 java8-quickstart-archetype可以满足要求:
mvn archetype:generate -DgroupId=eric -DartifactId=hello \
-Dversion=0.1 -DarchetypeArtifactId=java8-quickstart-archetype \
-DarchetypeGroupId=pl.org.miki -DinteractiveMode=false

这个原型的源代码可以在这里找到:github.com/mikolak-net/java8-quickstart-archetype

非常有用的信息,我将维护自己的原型以节省未来项目的时间。 - Eric

-2

1
你尝试过用它来生成项目吗?它会出现错误并且生成不了内容。它已经创建了将近10年了,也许与maven版本有关?无论如何,它都无法工作。 - alexbt
不,它是坏的。从某种意义上说,它是有效的,因为 OP 没有输错它的名称,并且它在 maven-repository.com 上列出。 - David Soroko
在Central上列出意味着它是一个常规的工件,您可以依赖它。这并不意味着它是原型,因为名称中有“原型”。要使工件成为有效的原型,它必须具有正确的元数据文件,正如我在我的答案中所解释的那样。 - Tunaki

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