使用 Maven 管理你的 Java 依赖

专注于解决问题,同时让这款开源工具跟踪你的 Java 库。
还没有读者喜欢这个。
What is your favorite open source Java IDE?

Pixabay。CC0。

作为一名开源爱好者,我使用过无数(数百个?)的库,这些库远远超出了我作为程序员的技能或兴趣范围。对于包括我在内的很多人来说,可用的库是使特定编程语言值得使用的原因之一。

一个开源库代表着你无需花费数小时甚至数天时间来解决一个并非你项目的核心问题,或者相反,如此核心以至于你的项目原本遥不可及的问题。更好的是,这是你无需维护的代码——除非它对你来说非常重要,以至于你决定为其做出贡献。

由于开源库是开源编程的重要组成部分,因此大多数编程语言都有一种方便的方法来确保它们易于包含在你的代码库中。

在 Java 中有几种管理库的方法,但我使用的方法是 Maven。

Maven 是一个代码管理框架,可以帮助你从中心位置跟踪依赖项、构建目标、报告和文档。这个中心位置是一个项目对象模型 (POM) 文件,它以 XML 编写,用于描述你项目的需求和期望。

当你决定更新库时,你只需更新你的 pom.xml 文件即可。

如果你要向项目中添加调试构建,请将其作为目标添加到 pom.xml 中。

当你升级到新的 Java 虚拟机 (JVM) 时,在 pom.xml 中进行操作。

如果这听起来很容易,你会很高兴知道入门也很容易。

安装 Maven

Maven 在大多数 Linux 发行版中都可以通过你的软件包管理器获得。

在 Fedora、Mageia 和类似发行版上

$ sudo dnf install maven

在 Elementary、Mint 和其他基于 Debian 的发行版上

$ sudo apt install maven

在 macOS 上,使用 MacPortsHomebrew

在 Windows 上,使用 Chocolatey

配置

在大多数系统中,Maven 在安装后已经配置完成。

但是,如果你有一个复杂的 Java 设置,为不同的项目安装了不同的版本,你可能需要设置你的 JAVA_HOME 环境变量

如果你不知道那是什么,请阅读我的文章 查找和设置你的 JAVA_HOME

首先,验证 Maven 是否已安装,并且正在使用你打算使用的 Java 版本

$ mvn -version
Apache Maven x.y.z
Maven home: /usr/share/maven
Java version: X.Y.Z, vendor: Red Hat, Inc.,
runtime: /usr/lib/jvm/java-XX-openjdk-XX

你的第一个 POM 文件

Maven 将其所做的一切都基于项目的 POM 文件。你可以将 pom.xml 视为 Maven 等同于 Autotool 的 Makefile 或 CMake 的 CMakeLists.txt 文件。你将对 Maven 有意义的指令放在 pom.xml 中,并在提示时执行这些指令。

优秀的 IDE,例如 Eclipse 或 NetBeans,在创建 Maven 项目时可能会提供一个样板 pom.xml 文件。

根据你对 XML 的熟悉程度,这个过程看起来可能比实际情况更复杂。这里使用 XML 有一个明显的优势,所以即使你不熟悉这种语言,也请看一看。

<?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>com.example</groupId>
    <artifactId>example4Maven</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
</project>

第一个元素(<?xml?><project>)包含关于文件本身的信息,将文档标识为根据 Maven POM 模式编写的 XML。下一组元素对应于使用的 Maven 模式和我提供给 NetBeans 的项目设置。

<packaging> 元素指定此项目旨在打包为 JAR 文件。

<properties> 元素告诉 Maven 关于我的项目中(尚未存在)的源代码。它以 UTF-8 编码为 OpenJDK 版本 11 编写。

所有这些都是我在创建示例项目时由 NetBeans 自动生成的。

如果你不使用与 Maven 集成的 IDE,或者你只是喜欢从头开始编写你的文件,你可以在 maven.apache.org/pom.html#Quick_Overview 找到 POM 文件的骨架大纲。它有清晰的注释,并且已经填充了 XML 声明。

向你的 POM 添加依赖项

很久以前,当你编写一个 Java 应用程序并决定使用外部库时,你可以下载库的 JAR 包,将其保存到你的代码库中,然后使用 import 语句在你的 Java 代码中引用它。这是一个手动系统,虽然它的工作方式与使用 C 或 C++ 库一样好,但维护起来可能需要大量工作。

Maven 使用仓库,很像 Linux 使用仓库进行 软件安装,而 Python 使用 pip。默认仓库是 Sonatype 的 Central Repository,你可以从 search.maven.org 搜索它。从 Central,你可以找到库以及你需要在 Maven 的所需依赖项字段中填写的相应元数据。然而,在实践中,大多数 Java 库都在其 README 文件或文档中提供该信息。

假设你有一个简单的 Java 脚本,用于列出目录中的文件,但你决定希望它只列出以 jpgpng 结尾的文件。Apache fileUtils 库为此类操作提供了文件名过滤器,但它未包含在 Java 发行版中。

package com.example.example4maven;

import java.io.File;
import java.util.Iterator;
import java.util.List;
// external libs
import org.apache.commons.io.FileUtils;

public class Main {
    private static final File myDir = new File("/home/tux/img");
    private static final String[] ext = new String[] { "jpg","png" };

    public static void main(String[] args) {
        List<File> images = (List<File>) FileUtils.listFiles(myDir, ext, false);
        for (Iterator<File> i = images.iterator(); i.hasNext();) {
            System.out.println(i.next().getName());
            }
    }
}

你可以搜索 Central 以查找该库,或者你可以访问该项目的 网站 并在那里获取依赖项信息。

依赖项信息看起来像这样

<dependency>
  <groupId>commons-io</groupId>
  <artifactId>commons-io</artifactId>
  <version>2.11.0</version>
</dependency>

在你的 pom.xml 文件中的 <dependencies></dependencies> 标签之间输入它,你就已将 Apache commons.io 库添加到你的项目中。

<?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>com.example</groupId>
    <artifactId>example4Maven</artifactId>
    <version>1.0</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.11.0</version>
            <type>jar</type>
        </dependency>
    </dependencies>
</project>

现在,当你构建你的项目时,Maven 可以自动下载你本地代码库中没有的任何库。

使用 Maven 构建 JAR 包

你可以使用 fastjar 或 gjar 等工具创建 JAR 文件,但 Maven 具有插件,使其能够执行常见的构建任务,包括打包。对于包含你的源代码的标准 JAR 包,你可以使用 maven-jar-plugin

要让 Maven 为你创建一个包含你的代码以及你的代码所需的所有依赖库的“Uber JAR”,你可以使用 maven-assembly-plugin。这两个插件在目的和配置上都很相似,并且它们都是构建插件,因此它们被输入到你的 pom.xml<build> 部分。

与库一样,插件的 Maven 元数据可从插件的主页获得。你通过在 <plugin> 标签之间列出其 groupIdartifactIdversion 来包含 maven-assembly-plugin

还有其他配置选项,包括

  • 一组预设行为
  • 根据项目名称而不是你的项目代号更改输出名称的能力
  • 将你自己的条目附加到 MANIFEST.MF 中的能力。

当你的主类不称为 Main.class 时,这很有用。

要告诉插件何时调用它,你还必须定义 Maven 构建中哪个关键字触发它。

对于 maven-assembly-plugin,你可能希望在你使用 mvn package 时激活它。

    <build>
   <plugin>
           <groupId>org.apache.maven.plugins</groupId>
           <artifactId>maven-assembly-plugin</artifactId>
           <version>3.3.0</version>
           <configuration>
             <descriptorRefs>
                   <descriptorRef>jar-with-dependencies</descriptorRef>
             </descriptorRefs>
             <finalName>Lister-${project.version}</finalName>
             <appendAssemblyId>false</appendAssemblyId>
               <archive>
                   <manifestFile>src/main/resources/META-INF/MANIFEST.MF \ 
</manifestFile>
               </archive>
           </configuration>
           <executions>
               <execution>
                   <id>make-assembly</id>
                   <phase>package</phase>
                   <goals>
                       <goal>single</goal>
                   </goals>
               </execution>
           </executions>
   </plugin>
   </plugins>
</build>

测试你的构建

$ mvn clean package

在你的项目构建之后,你可以在自动生成的 targets 目录中找到你的 Uber JAR

$ java -jar targets/Lister-1.0.jar
foo.png
foo.jpg
bar.jpg
bar.png

它按预期工作。

使用 Maven 构建

Maven 使管理你的 Java 项目变得轻松且具有弹性。借助 Maven,贡献者可以快速启动他们的环境,获取他们需要的所有库,并为他们的用户创建可预测的构建。它的 XML 配置使语法简单且可 lint,并且使添加新选项变得容易。

在你的下一个 Java 项目中尝试 Maven,看看你的想法。

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,通常同时进行。

评论已关闭。

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.