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

Maven - Is `maven-archetype-simple` a valid archetype?

通常,我使用原型 maven-archetype-quickstart 创建 maven jar 项目,效果很好。

但我想创建没有示例的 Maven 项目 App.java class,因此我尝试了 maven-archetype-simple 原型,但出现错误。

Maven 命令:

mvn archetype:generate -DgroupId=eric -DartifactId=hello -Dversion=0.1 -DarchetypeArtifactId=maven-archetype-simple -DinteractiveMode=false -X -DarchetypeCatalog=local

错误提示:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:2.4:generate (default-cli) on project standalone-pom: The defined artifact is not an archetype -> [Help 1] org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.apache.maven.plugins:maven-archetype-plugin:2.4:generate (default-cli) on project standalone-pom: The defined artifact is not an archetype 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: The defined artifact is not an archetype 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: The defined artifact is not an archetype 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] [ERROR] For more information about the errors and possible solutions, please read the following articles: [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException

问题是:

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

这是一个有效的 Maven 原型,参见 https://mvnrepository.com/search?q=maven-archetype-simple

神器maven-archetype-simpledoes exist on Maven Central, but it isn't a valid archetype since it doesn't containt the right metadata files. A valid archetype must have in its JAR file:

  • 或者 META-INF/maven/archetype-metadata.xml(这是新格式);
  • META-INF/maven/archetype.xml 甚至 META-INF/archetype.xml(这是旧格式)。

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

我不确定是否存在可以生成 只是 具有给定 Maven 坐标的单独 pom.xml 的原型。这实际上是使用 maven-archetype-quickstart,而不生成 App.javaAppTest.java 的效果。请记住,原型实际上是用于从预定义模板创建项目,例如示例 Java EE 应用程序或示例 Maven 项目;所有这些都需要比编写 POM 文件更多的设置。

如果你真的,真的,不想要那些文件,你可以

Create your own archetype

创建一个新的 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。所以,当然,你现在可以 customize this archetype of yours.

删除文件

或者您认为这样做不值得,创建文件后删除文件要简单得多:

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

或者 rm -rf hello/src 如果您使用的是 Linux 机器。