选择一个简单Java项目的原型是什么?

102

mvn archetype:generate提供了过多的选项,而我想创建一个带有junit测试用例的简单java工具。我想知道在这里应该使用哪个原型?


我建议您阅读Maven入门指南。它简短明了,涵盖了很多内容。 - Sahil Muthoo
11个回答

81

我使用两个典型。这取决于你将创建什么类型的应用程序。

如果你需要一个Web应用程序,请使用maven-archetype-webapp,或者如果你需要一个简单的应用程序,可以使用maven-archetype-quickstart。它们很有用,因为你可以毫无问题地扩展它们。


1
请注意,这在Eclipse插件中默认情况下是存在的(至少今天是这样)。 - Ben
我要创建maven-archetype-webapp并下载maven目录,但是出现了错误。 - Mowgli
我该怎么办? - Mowgli
maven-archetype-quickstart唯一让我困扰的是它生成的依赖版本过旧,自2018年以来没有发布新版本。有人知道如何为此做出贡献吗? - gerrytan

24

我正在使用如下命令:

mvn archetype:generate -Dfilter=org.apache.maven.archetypes:

我只会从 org.apache.maven.archetypes 组中获取一个简短列表。最适合入门的是像我的前辈所说的 maven-archetype-quickstartmaven-archetype-webapp


请注意,在过滤器末尾添加“:”以按groupId进行过滤(https://maven.apache.org/archetype/maven-archetype-plugin/generate-mojo.html)。 - Cristiano Costantini

18
当你执行mvn archetype:generate命令时,会出现一个默认选择,用括号()包围,例如(1274)。如果你向上滚动以查看#1274是什么,通常它是默认的Java原型,可以尝试或开始使用,如果进行简单的Java项目,那么选择它是安全的。

默认值现在是333,而不是3。 - TimP
4
现在是380:remote -> org.apache.maven.archetypes:maven-archetype-quickstart(包含一个示例Maven项目的原型) - slf
1
它说的是例如,而不是即,因此它暗示默认选择为3。 - OCB
2
现在是644 org.apache.maven.archetypes:maven-archetype-quickstart:1.1 - aliopi
现在是874 :) - miku

12

9
我认为你应该使用 maven-archetype-simple
编辑:
根据maven的文档
  • maven-archetype-quickstart 包含一个示例Maven项目的原型。
  • maven-archetype-simple 包含一个简单的Maven项目的原型。

5
在我的 Eclipse 选择中没有看到 maven-archetype-simple,但我看到了 maven-archetype-quickstart。它们是一样的吗? - huahsin68
请查看我最新的编辑,其中提到了Maven文档。关于Eclipse插件:我个人更喜欢手动编辑pom.xml并从命令提示符中运行命令行。 - AlexR

6
我建议从一个非常简单的pom.xml文件开始,只包含所需的内容。例如:
<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.app</groupId>
  <artifactId>my-module</artifactId>
  <version>1</version>
</project>

来自http://maven.apache.org/guides/introduction/introduction-to-the-pom.html

POM(Project Object Model)是Maven项目的基本单位,是一个XML文件,包含了项目的配置信息,如依赖、插件、版本等。通过POM可以方便地管理和构建项目。


14
虽然这个建议可能有一定的价值,但它并没有回答问题。据我理解,原型的整个目的就是为了让开发人员免受此类样板代码之苦,并使最佳实践易于遵循。 - Michael Scheper

3

您可以使用The Practical Developer中的任何基本工具:

Java 8 + 常用测试库:

mvn archetype:generate -DgroupId=[your-project-groupId] -DartifactId=[your-project-name] -DarchetypeGroupId=com.thepracticaldeveloper -DarchetypeArtifactId=archetype-java-basic-tpd -DarchetypeVersion=1.0.0

Java 9+常用测试库

mvn archetype:generate -DgroupId=[your-project-groupId] -DartifactId=[your-project-name] -DarchetypeGroupId=com.thepracticaldeveloper -DarchetypeArtifactId=archetype-java-basic-tpd -DarchetypeVersion=1.0.0 -Djava-version=9

他们包括JUnit 4、Mockito和AssertJ,以及一个默认清单文件(manifest file),以便您希望将您的jar文件变成可执行文件。更多信息请见:https://thepracticaldeveloper.com/archetypes/ 免责声明:我是该博客的作者。

我得到了 groupId,但是 archetypeGroupId 是什么? - lupchiazoem
1
它用于与archetypeArtifactId一起在Maven存储库中定位原型。 - Moisés

2
您可能想考虑使用Java Archetype:它具有合理的默认设置,可以快速启动一个符合最佳实践的Java项目,包括JUnit测试。我将其构思为maven-archetype-quickstart的现代继承者。 示例:mvn archetype:generate -DarchetypeGroupId=io.github.oliviercailloux -DarchetypeArtifactId=java-archetype -DgroupId=mygroupid -DartifactId=myartifactid -DinteractiveMode=false
免责声明:我是作者。
有关替代方案的更多信息,请参见该项目的README的部分内容(提供了比此处复制的更多链接)。 官方快速入门原型 用于简单Java项目的官方原型(由Apache Maven入门指南和Apache Maven Cookbook提到)是maven-archetype-quickstart,或完整的org.apache.maven.archetypes:maven-archetype-quickstart。
在我看来,它应该被视为已弃用,因为它存在几个问题。
  • 一个重要问题是它创建依赖于JUnit 4的项目。当前版本JUnit 5有很大差异,提供了改进的API等。
  • 次要问题:它的默认版本是1.0-SNAPSHOT,应该是1.0.0-SNAPSHOT以遵循推荐和通常的方案。
  • 另一个小缺点:它创建了为1.7 JVM配置的项目。如果您特别需要支持旧安装程序,则可能是适当的选择,但对于新项目来说,选择一个相当新的JVM是更合理的默认规则。例如,Java 8引入了lambda表达式,您可能不想错过。
我的原型还提供默认日志记录,我认为这很有用,比sysout更好扩展,不会损害Guava,我认为这有助于丰富Java。 Maven中央的其他快速入门原型 为了尽可能地加入努力并避免浪费性的重复,我积极搜索了其他具有与我相同目标的原型:提供具有合理默认值的简单原型,以便轻松启动现代Java项目。(这主要在2020年6月左右完成。)
通过在互联网上进行一般搜索,我找到了The Practical Developer。在联系后,他通过电子邮件写信给我,表示他不定期工作于自己的原型,因此拒绝合作此类项目。
由于在网络上没有找到其他有用的结果,而且我也没有找到适合我的需求的专业搜索工具,因此我实现了一个简单的原型浏览器。它列出了Maven Central中所有可用的原型。由于手动审查的数量太多,因此我选择了那些自至少三年以来存在groupId和artifactId,并在最近一年内进行了更新的项目,希望能够找到长期维护的项目,这可能表明该项目更有可能是高质量的项目。(当然,这个过滤器可能会错过完全符合所述目标的高质量原型;我无法知道。例如,正如本原型随着时间的推移已更改其artifactId一样,它不符合该过滤器。)
然后,我根据它们在POM中的原型描述手动筛选了结果列表,并对其中一些有前途的原型进行了进一步的查看(通常是在官方网站上)。其中只有com.github.ngeor:archetype-quickstart-jdk8被证明是一个合适的候选者。但是它的作者写信给我说他“现在并没有真正使用/维护这个原型”。

2

Maven Quickstart原型

正如其他人所指出的,一个简单的Java应用程序的常见起点是QuickStart原型。

生成以下文件夹和文件:

diagram of files and folders in a newly created project using QuickStart archetype

从控制台的命令行中:
mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DarchetypeArtifactId=maven-archetype-quickstart -DarchetypeVersion=1.4

请注意,截至2023-07,1.4是当前版本。
IntelliJ IDE中,按照此屏幕截图开始一个新项目。

screenshot of New Project dialog box in IntelliJ with QuickStart archetype selected

将版本从1.1更改为1.4(目前最新版本)。令人费解的是,IntelliJ对话框从未提供最新版本。

enter image description here

打开高级设置面板。指定Maven信息的各个字段:GroupID、ArtifactID和Version。请参考this Answer进行指导。

enter image description here

点击“创建”按钮以生成新项目。等待片刻,因为Maven正在执行其任务,将原型扩展为真实项目。
不幸的是,我们还没有准备好进行Java编程。POM.xml文件需要进行一些调整。即使是最新版本的QuickStart原型,在其各个部分的版本方面也相当过时。根据我的经验,通常最好将所有版本更改为它们各自的最新版本。
首先,更新项目的Java版本。您通常应该使用以下之一:
  • 其中一个LTS版本:8、11、17。
  • 最新版本:20。
在指定Java版本时,现代工具中我们可以用单个.release标签替换.source.target标签对。
<maven.compiler.release>20</maven.compiler.release>

首先加载POM中的第一个更改。在IntelliJ中,找到带有蓝色M标志的小浮动窗口。点击该标志。否则,在IntelliJ中打开Maven面板。点击第一个图标以重新加载所有Maven项目。

验证您的项目是否运行。打开App.java文件。点击空心绿色图标以弹出菜单;选择Run App.main()。确保在IDE的控制台面板中获得成功的输出。

回到POM.xml,在使用JUnit 4的基础上改为使用JUnit 5 Jupiter技术。将整个<dependency>标签替换为JUnit Jupiter (Aggregator)依赖项。Aggregator表示为了方便起见引入了一些相关的依赖项。

<!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
<dependency>
    <groupId>org.junit.jupiter</groupId>
    <artifactId>junit-jupiter</artifactId>
    <version>5.10.0-M1</version>
    <scope>test</scope>
</dependency>

将自动生成的App.test文件现代化,使用JUnit 5 Jupiter。用以下两行替换import行:

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertTrue;

点击绿色的空心图标选择run shouldAnswerWithTrue()。在IntelliJ的*Run`面板中寻找绿色的勾号。
接下来,我们更新剩余部分的版本号。
更新您的本地Maven依赖数据缓存。在IntelliJ的设置中,转到Build, Execution, Deployment > Build Tools > Maven > Repositories。要快速转到那里,只需在设置的列顶部的查找字段中键入repo。一旦到达该面板,选择列出的每个Maven仓库,并点击Update按钮。执行更新可能需要几分钟时间。
更新后,通过删除每个<version>标签的内容并按下Control + Spacebar,您可能会看到最新的版本号。您可能希望将实际的最新数字与Maven仓库的网站进行验证。
完成后,您应该拥有一个类似于以下内容的POM文件:
<?xml version="1.0" encoding="UTF-8"?>

<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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>work.basil.example</groupId>
    <artifactId>ExampleQS</artifactId>
    <version>1.0-SNAPSHOT</version>

    <name>ExampleQS</name>
    <!-- FIXME change it to the project's website -->
    <url>http://www.example.com</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.release>20</maven.compiler.release>
    </properties>

    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter -->
        <dependency>
            <groupId>org.junit.jupiter</groupId>
            <artifactId>junit-jupiter</artifactId>
            <version>5.10.0-M1</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
            <plugins>
                <!-- clean lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#clean_Lifecycle -->
                <plugin>
                    <artifactId>maven-clean-plugin</artifactId>
                    <version>3.2.0</version>
                </plugin>
                <!-- default lifecycle, jar packaging: see https://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
                <plugin>
                    <artifactId>maven-resources-plugin</artifactId>
                    <version>3.3.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.11.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>3.0.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-jar-plugin</artifactId>
                    <version>3.3.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-install-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <plugin>
                    <artifactId>maven-deploy-plugin</artifactId>
                    <version>3.1.0</version>
                </plugin>
                <!-- site lifecycle, see https://maven.apache.org/ref/current/maven-core/lifecycles.html#site_Lifecycle -->
                <plugin>
                    <artifactId>maven-site-plugin</artifactId>
                    <version>4.0.0-M3</version>
                </plugin>
                <plugin>
                    <artifactId>maven-project-info-reports-plugin</artifactId>
                    <version>3.4.1</version>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

做一个Maven的clean操作。运行你的应用程序,运行你的测试。一切都应该正常。现在你已经准备好开始你的Java编程了。

这个答案以IntelliJ作为示例。您应该能够在其他IDE(如EclipseNetBeans)中做类似的事情。 Maven(以及Gradle等替代品)的一个主要好处是它在各种IDE中的工作方式相同。


非常感谢您在这个出色回答背后所付出的努力! - undefined

1
默认原型编号现在是1092 1092: 远程 -> org.apache.maven.archetypes:maven-archetype-quickstart(包含示例Maven项目的原型。)

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