Maven
Maven 是一个构建自动化工具,Java 开发者使用它来编译、构建和部署代码、文档和库。
安装
配置
创建新项目
Maven 提供了 Archetypes,它们是从 Maven 仓库中拉取的项目结构。
要创建一个新项目,您可以使用以下命令
$ mvn archetype:generate
这将在命令行中弹出一个交互式提示,允许您选择要使用的 archetype 来创建项目。
无交互式提示
您也可以在没有交互式提示的情况下创建 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 的当前最新版本。
技巧和提示
创建 Maven 仓库
许多开发者依赖于公共托管的 Maven 仓库来部署他们的项目(例如库、插件和 archetype)。对于很多人来说,这会引起隐私问题。好消息是,您可以自行托管。托管 Maven 仓库的软件统称为 Maven 制品管理器 或 Maven 仓库管理器,但是任何 Web 服务器都可以充当 Maven 仓库。
有 许多 可用的 Maven 制品管理器
- Reposilite - 免费开源的 Maven 制品管理器,用 Java 编写。
- Archiva - 开源 Maven 制品管理器,用 Java 编写,由 Apache 团队提供。
- Gitea - 开源 Git 服务器,提供内置的软件包部署,支持 Java (Maven)。
- ProGet - 专有 Maven 制品管理器,专为企业部署而设计。
- JFrog Artifactory - 有两个版本,见下文
- Sonatype Nexus - 有两个版本,见下文
以上任何一种都可以用来自行托管您的 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
推送,人们将能够从您的仓库中拉取您的制品。(拉取制品不需要身份验证,只有推送需要)。