Maven

出自 ArchWiki
(重定向自 Apache Maven)

此条目或章节需要扩充。

原因: 此页面仍在积极开发中,页面内容可能会发生变化。(在 Talk:Maven 中讨论)

此条目或章节正在考虑移除。

原因: 页面中的重复信息应该被移除,并链接到 Maven 提供的文章,除非另有扩充。(在 Talk:Maven 中讨论)

Maven 是一个构建自动化工具,Java 开发者使用它来编译、构建和部署代码、文档和库。

注意: 此页面并非旨在指导如何编写代码,或如何使用 Java 编程语言,而是面向那些正在使用 Maven 的用户,Maven 在 AUR 中被广泛使用。

安装

安装 maven

配置

创建新项目

Maven 提供了 Archetypes,它们是从 Maven 仓库中拉取的项目结构。

要创建一个新项目,您可以使用以下命令

$ mvn archetype:generate

这将在命令行中弹出一个交互式提示,允许您选择使用哪个原型来创建您的项目。

注意: 诸如 eclipse-java-binAURintellij-idea-community-edition 等 IDE 将 Maven 工具包装在其 GUI 中,请查阅您各自 IDE 的文档,而不是使用上面的命令。

没有交互式提示

您也可以在没有交互式提示的情况下创建 mvn 项目。Java 在对包进行分组时使用 反向域名表示法,例如,如果您的域名是 example.com,则您的 groupid 将是 com.example,您的 artifactId 应该是您的项目名称,全部小写。

$ mvn -B archetype:generate -DgroupId=com.example  -DartifactId=example -DarchetypeArtifactId=maven-archetype-quickstart
注意: -B 标志用于在非交互式(批处理)模式下运行 mvn

这将为您创建整个项目布局,并为您提供一个基本的 pom.xml 文件以开始使用,可以根据需要进行修改或添加。

贡献到现有的 Maven 项目

Maven 应该会自动获取其索引,

创建 Maven Wrapper

Maven 允许创建类似于 Gradle 的 Maven Wrapper,这可以防止不同开发者之间的版本不匹配,因为 Wrapper 确保任何参与项目开发的开发者都使用相同的版本。

要在项目根目录中创建 Maven Wrapper,请使用以下命令

$ mvn -N wrapper:wrapper -Dmaven=version
注意: -N 标志用于非递归地创建 Wrapper,它只会为根项目创建 Wrapper,而不会为任何子项目创建 Wrapper,这在包含子项目的项目中很重要。

version 替换为 Wrapper 要使用的所需的 Maven 版本,这通常是 Maven 的最新版本,请参阅 maven 以查找当前最新的 Maven 版本。

注意: 一旦 Wrapper 安装在项目中,为了编译项目,Maven 不再需要安装在您的系统上(不建议卸载它,应该保留并且不使用),您应该始终在项目中调用 Maven Wrapper。

提示和技巧

创建 Maven 仓库

许多开发者依赖于公共托管的 Maven 仓库来部署他们的项目(例如库、插件和原型)。对于很多人来说,这会引起隐私问题。好消息是,您可以自己托管。托管 Maven 仓库的软件统称为 Maven 制品管理器Maven 仓库管理器,但是任何 Web 服务器都可以充当 Maven 仓库。

很多 可用的 Maven 制品管理器

  • Reposilite - 免费开源的 Maven 制品管理器,用 Java 编写。
  • Archiva - 开源 Maven 制品管理器,用 Java 编写,由 Apache 团队提供。
  • Gitea - 开源 Git 服务器,提供内置的包部署,支持 Java (Maven)。
  • ProGet - 专有 Maven 制品管理器,专为企业部署而设计。
  • JFrog Artifactory - 有两个版本,见下文
    • 社区版 - 开源 Maven 制品管理器,专为非商业用途而设计。
    • 专业版 - 专有 Maven 制品管理器,专为商业用途而设计。
  • Sonatype Nexus - 有两个版本,见下文
    • OSS 版 - 开源 Maven 制品管理器,专为非商业用途而设计。
    • 专业版 - 专有 Maven 制品管理器,专为商业用途而设计。

以上任何一种都可以用于自托管您自己的 Maven 仓库,专有(商业)产品是非免费的,需要许可证才能使用。

使用 nginx

Web 服务器,例如 Nginx 可以用来托管 Maven 仓库。但是请注意术语上的差异,这将不是一个仓库管理器,它只是仓库部分,所有管理都必须通过命令行手动完成,或者直接编辑仓库的结构。也可以使用其他 Web 服务器,但是它们必须支持 WebDAV 协议

在本指南中,我们将使用 /var/repository 作为存储制品的首选目录。

确保权限设置正确

# chmod 750 /var/repository
# chown http:http /var/repository

在本示例中,我们将不允许任何不在 “http” 组中的用户查看仓库的内容。这在大多数情况下应该足够好,因为文件将通过 Maven 推送,而不是由您直接添加。

接下来,在继续本指南之前,请确保您已按照 Nginx 中的安装步骤进行操作。

接下来,为 nginx 添加以下配置

/etc/nginx/sites-enabled/maven
server {
    listen 80;
    server_name your.domain.name;

    location / {
        root /var/repository;
        create_full_put_path on;
        autoindex on;
        dav_methods PUT DELETE MKCOL COPY MOVE;
        dav_access user:rw group:rw;

        limit_except GET {
                auth_basic "Restricted Area";
                auth_basic_user_file /etc/nginx/.htpasswd;
        }
    }
}

上面的示例不提供 TLS 加密。这对于本地 Maven 仓库很有用,但是如果您想部署您的仓库以供其他人访问,则应使用 TLS 加密(见下面的配置)。

/etc/nginx/sites-enabled/maven
server {
    listen 443 ssl;
    server_name your.domain.name;
    
    ssl_certificate /path/to/your/fullchain;
    ssl_key /path/to/your/key;

    location / {
        root /var/repository;
        create_full_put_path on;
        autoindex on;
        dav_methods PUT DELETE MKCOL COPY MOVE;
        dav_access user:rw group:rw;

        limit_except GET {
                auth_basic "Restricted Area";
                auth_basic_user_file /etc/nginx/.htpasswd;
        }
    }
}

设置以下值

  • server_name 设置为您希望用于 Maven 仓库的主机名,如果您在 LAN 上运行此操作,则可以使用 localhost,并且可以通过在 Web 浏览器中输入服务器的本地 IP 来访问仓库。
  • ssl_certificate 设置为您的 fullchain 证书的路径。
  • ssl_certificate_key 设置为您的证书密钥的路径。

nginx 配置的 limit_except GET 部分阻止未经授权的用户将其依赖项推送到您的仓库,在本示例中,我们将使用 nginx 的 BASIC 身份验证。BASIC 身份验证在使用 HTTPS 时才是安全的,因此您不应通过 HTTP 使用 BASIC 身份验证,因为密码将被泄露。

为了帮助创建 .htpasswd 文件,我们将使用 htpasswd(1),它由 apache 软件包提供。

# htpasswd -c /etc/nginx/.htpasswd username

然后,系统将提示您输入密码,此密码将与您在命令中指定的用户名一起保存。

您刚刚创建的用户现在有权将制品推送到仓库。

现在让我们设置文件的权限

# chmod 640 .htpasswd

这将防止任何其他用户读取 .htpasswd 的内容,这可能会导致安全漏洞(请记住密码是哈希的,但这不应该被依赖)。

接下来,我们需要配置 Maven,以便它能够推送到镜像,在您要推送的系统上,并以您要授予仓库权限的用户身份登录,创建并编辑以下文件 $HOME/.m2/settings.xml

现在您将需要用户名和密码的 base64 表示形式,以使用以下命令添加到 HTTP 标头进行身份验证

$ echo -n "username:password" | base64

返回的值是您仓库的基本身份验证令牌。

注意: -n 标志是强制性的,以防止包含换行符 (\n),这会导致身份验证失败。

您必须将 username 替换为您创建 .htpasswd 时使用的用户名,并将 password 替换为您在提示创建密码时输入的密码。用户名和密码都必须用 “:” 分隔。

现在将以下内容添加到您的 Maven settings.xml

$HOME/.m2/settings.xml
<settings>
  <servers>
    <server>
      <id>some-id</id>
      <configuration>
        <httpHeaders>
          <property>
            <name>Authorization</name>
            <value>Basic token</value>
          </property>
        </httpHeaders>
      </configuration>
    </server>
  </servers>
</settings>

some-id 替换为您仓库所需的 ID,这用于将 settings.yml 中为仓库设置的配置值与代码库中的 pom.xml 标识关联。然后,您需要将 token 替换为您从上面的 base64 命令创建的令牌。

您现在应该有权将新构建推送到您的仓库,一旦使用 mvn publish 推送,人们将能够从您的仓库中拉取您的制品。(拉取制品不需要身份验证,只需要推送)。