ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Maven笔记 一

2021-08-29 16:33:36  阅读:120  来源: 互联网

标签:INFO maven --- jar 笔记 Maven hello


Maven简要介绍

Maven是一个构建工具,构建工具的作用就是帮你完成一整套复杂的构建工作,包括整合静态资源、编译、测试、打包、发布等工作。

安装步骤我就跳过了,就是下载,解压,设置环境变量,上网查查。

Maven目录结构

bin是可执行文件目录。

boot中只有一个人文件,plexus-classworlds-2.6.0.jar,用于提供Maven自己定义的一个ClassLoader。

conf就是配置文件,其中的settings.xml是Maven软件的配置文件。

lib是maven的功能代码库和用到的依赖库。

用户目录

用户目录(C:\User\[用户名],类unix系统是/home/[用户名])下,有一个.m2文件夹,这是maven的用户文件夹,可以指定基于用户的个性化配置。

建议所有的配置都在这里,不会影响其他用户之外,还与Maven的安装目录解耦,如果更新的时候不用重新编写配置。

创建Maven项目

Maven项目有一些规约。

src/main/java -- 这个目录存储项目代码
src/test/java -- 这个目录存储测试代码
pom.xml  --  项目的配置

创建pom.xml

我们先编写下pom.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/maven-v4_0_0.xsd">

    <modelVersion>4.0.0</modelVersion>
    <groupId>io.lilpig.hellomvn</groupId>
    <artifactId>hello-world</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>Maven Hello World Project</name>

</project>

modelVersion,对于Maven2和Maven3规定必须是4.0.0groupIdartifactIdversion定义了一个maven项目的唯一位置,你使用maven添加依赖的时候也是,通过这三个属性来确定引入的依赖,然后去maven仓库中拉取对应的依赖。

groupId说明了项目隶属于哪个组,其实就相当于你的域名,artifactId定义了当前项目在组中的唯一ID,其实就相当于项目名,version定义了当前项目的版本。

创建Java主类

创建src/main/java,并且在其中创建你的包结构io.lilpig.hellomvn.helloworld,注意,项目名也要在包名中!!因为这是Java的规约。

在新建的包中创建主类

package io.lilpig.hellomvn.helloworld;

public class HelloWorld {
    public String sayHello() {
        return "Hello,MVN";
    }

    public static void main(String...args){
        System.out.println(new HelloWorld().sayHello());
    }
}

现在我们就可以使用Maven进行构建了!

mvn clean compile

如果顺利的话,应该能够编译成功。不过我失败了,先解决这个问题。

解决[ERROR] 不再支持源选项

Build项目的时候遇到的问题:

[ERROR] 不再支持源选项 5。请使用 6 或更高版本。 [ERROR] 不再支持目标选项 1.5

解决办法就是,我这里修改的是用户路径下的settings.xml,也就是C:\Users\[你的用户名]\.m2\settins.xml

profiles标签中添加这样一段指明JDK版本。

我这里是jdk11,按照自己的版本填写。

<profile>
    <id>jdk-11</id>
    <activation>
    <jdk>11</jdk>
    <activeByDefault>true</activeByDefault>
    </activation>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>11</maven.compiler.source>
        <maven.compiler.target>11</maven.compiler.target>
    </properties>
</profile>

再次编译就已经成功了。

在编译成功的信息中可以看到下面的信息

可以看到首先调用了maven-clean-plugin进行了项目清理工作,这个工作主要做的就是删除target文件夹,这是Maven生成的编译输出文件夹,这部操作的目的就是清除以前的代码。

然后就调用了resource来将静态资源打包进target,显然现在我们没有静态资源,它跳过了,而且我们也看到了,Maven指定的静态资源的路径在src/main/resources中。

最后调用了compile来进行编译,并且编译到了target/classes中。

编写测试代码

创建src/test/java和包目录结构,在pom.xml中添加Junit依赖。

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.7</version>
        <scope>test</scope>
    </dependency>
</dependencies>

通过引入依赖,我们也能够看到使用groupIdartifactIdversion来唯一定义一个项目是多么方便,如果需要引入一个依赖,只需要给定这三个参数,Maven就会去中央仓库中自动寻找并下载这个库,并依赖到项目中。

scope指定了该库的作用域,test意为只在测试文件夹中可用。

创建测试类

package io.lilpig.hellomvn.helloworld;

import static org.junit.Assert.assertEquals;
import org.junit.Test;

public class HelloWorldTest {
    @Test
    public void testSayHello() {
        HelloWorld helloWorld = new HelloWorld();
        String result = helloWorld.sayHello();
        assertEquals("Hello,MVN", result);
    }
}

然后,运行mvn clean test会自动编译并进行所有单元测试。当然,你第一次运行的时候是会帮你下载Junit依赖的。

下面是一部分输出

D:\source\mavenlearn\hello-maven>mvn clean test
[INFO] Scanning for projects...
[INFO]
[INFO] -------------------< io.lilpig.hellomvn:hello-world >-------------------
[INFO] Building Maven Hello World Project 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ hello-world ---
[INFO] Deleting D:\source\mavenlearn\hello-maven\target
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hello-world ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\source\mavenlearn\hello-maven\src\main\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ hello-world ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\source\mavenlearn\hello-maven\target\classes
[INFO]
[INFO] --- maven-resources-plugin:2.6:testResources (default-testResources) @ hello-world ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] skip non existing resourceDirectory D:\source\mavenlearn\hello-maven\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ hello-world ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\source\mavenlearn\hello-maven\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ hello-world ---
[INFO] Surefire report directory: D:\source\mavenlearn\hello-maven\target\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running io.lilpig.hellomvn.helloworld.HelloWorldTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.035 sec

Results :

Tests run: 1, Failures: 0, Errors: 0, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  2.053 s
[INFO] Finished at: 2021-08-29T14:46:36+08:00
[INFO] ------------------------------------------------------------------------

可以注意到除了常规的清理、打包静态资源、编译等工作,Maven还帮我们做了测试,并打印了测试结果。

打包

mvn clean package可以将我们的项目打成jar包。

我这里就只截图一部分结果

可以看到最后使用了jar插件来进行打包,并且以artifactId-version.jar的名字来打包到target下。

我们尝试来运行这个jar包

嘶,什么原因呢??

解决xxx.jar中没有主清单属性

一个Jar文件,如果想要可以被执行,必须在其META-INF/MANIFEST.MF文件中指定它的主类。使用如下配置:

Main-Class: <packagename>.<classname>

Maven默认情况下没有做这个工作,因为也不是所有jar包都是要被运行的,大多是以依赖存在。

我们直接向这个jar包的META-INF/MANIFEST.MF中添加这行代码,然后重新压缩成jar,再去执行这个jar包,发现已经可以执行了。

所以问题就在于Maven构建这个jar包的时候并没有添加主类信息。

如何解决呢?我们在pom.xml中添加一个插件maven-jar-plugin的配置。这个插件是maven自带的,你执行mvn clean package时会在日志中看到它和它的版本。

<build>
    <plugins>
        <plugin>
            <!-- Build an executable JAR -->
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <!-- 这里填写你自己的jarplugin的版本 -->
            <version>2.4</version>
            <configuration>
                <archive>
                    <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>lib/</classpathPrefix>
                        <!-- 指定主类全限定名 -->
                        <mainClass>io.lilpig.hellomvn.helloworld.HelloWorld</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

再次打包,运行,能够直接调用主方法了。

安装到本地库

当你打完Jar包之后,你希望以后你的其他项目中都可以直接引用到你的库,这时可以使用mvn clean install命令来将你的jar包安装到本地库中。

这里显示Maven已经把我们的Jar包(和pom文件)打包到用户文件夹下的repository里面的对应项目中去了,在其他项目中,我们能通过pom.xml指定groupIdartifactIdversion来依赖这个jar包。

archetype(了解)

嘶?难道我们每次创建一个maven项目都要这么麻烦的创建一大堆东西吗?那我还不如自己来。

archetype可以解决这个问题,它是一个maven项目脚手架。

mvn archetype:generate

执行就会下载相应依赖并且创建项目

当然,现代IDE都有这个功能了。

参考

标签:INFO,maven,---,jar,笔记,Maven,hello
来源: https://www.cnblogs.com/lilpig/p/15202856.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有