Maven0-学习笔记

1,classpath

  • classpath就是类路径,是java命令在执行java程序的时候,寻找class的路径。
  • 可以是文件夹或者jar包的路径的组合。
  • 一般执行java命令的时候都会配以classpath参数,参数是这个程序用到的所有jar包路径组合(用分割符分开,windows用;,linux用:)。
  • 没有指定那么java命令会默认将当前路径加入到classpath。

2,Maven的作用

  • 运行时可以使用java命令的classpath参数传递jar包路径。但是:发布jar包不方便,寻找jar包不方便,使用jar包不方便,编译打包自己的程序不方便,升级jar包不方便,jar 包之间的依赖管理更是无法想象的困难和繁琐。
  • Maven就是解决jar包管理问题的,而且可以做的更多。(python的pip,Ubuntu的apt,centos的yum)

3,Maven-jar包的仓库

  • Maven有两部分:首先是服务器端,叫做maven repo,或者nexus server,它将所有的jar包放在一个仓库里。需要用到某个jar包,就去这个仓库下载。
    • 仓库里每个jar包,都有唯一的id。这个id是由三部分组成的:group id,artifact id和version
    • 为了避免每次都从服务器下载artifact (jar包), maven会把下载好的artifact放在本地的文件夹,这个就叫做local repo。
  • Maven的客户端:
    • 如果一个项目依赖某个jar包(jar1),那么就把jar1对应的id加入到自己的依赖里, maven客户端就可以通过id找到并使用相应的jar包了(写个配置文件)
    • 同时,maven的依赖是传递的。如果使用maven发布项目的jar包(jar)到maven repo,maven还会记住项目的jar包依赖于jar1,如果有别的项目依赖jar,那么它将自动依赖jar1,无需再次声明。

4,Maven的安装和配置

  • 安装
    • apache maven下载
    • apache maven安装
    • 测试maven安装:在命令行执行mvn -V
  • 配置
    • 阿里云的maven repo镜像配置方法
      • 使用阿里云的镜像:要将项目下的sttings.xml文件拷贝到home目录下的.m2文件夹下。( 如果没有这个文件夹就创建)
    • IntelliJ的Maven settings配置阿里云镜像
      • 打开 file-settings
      • 搜索 maven,在Build tools -> Maven
      • user setting files -> override(路径就是拷贝到home目录下的.m2文件夹下的sttings.xml文件)

5,Maven的使用

  • 使用idea下载:写好pom.xml文件,idea中直接file->open即可
    • 找到需要的jar包的maven格式的<dependency>,加入到pom.xml文件的<dependencies>,然后右键pom.xml->maven->reload即可
    • 下载的jar包的位置在settings中maven的Local respository
  • 也可以命令行下载:cd到pom.xml文件所在的目录,终端运行命令mvn install -U(-U表示得到最新的snapshot的jar包,也就是非稳定jar包),终端还会显示jar包保存的路径。
  • jar包存储地址默认就是:C:\Users\用户名\.m2\repository\pom.xml文件中的groupId\pom.xml文件中的artifactId\pom.xml文件中的version\pom.xml文件中的artifactId-pom.xml文件中的version.jar
  • 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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>tensor-zhang</groupId>
    <artifactId>helloMaven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>helloMaven</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <encoding>UTF-8</encoding>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.0-jre</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.2</version>
        </dependency>
    </dependencies>
	
    <repositories>  
        <repository>  
            <id>alimaven</id>  
            <name>aliyun maven</name>  
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>  
            <releases>  
                <enabled>true</enabled>  
            </releases>  
            <snapshots>  
                <enabled>false</enabled>  
            </snapshots>  
        </repository>  
    </repositories>  

</project>

6,Maven的常用命令和插件

  • maven构建中的几个主要的phase:compile(java源文件->class文件), test(执行测试代码), package(打包为jar包), install(将jar包、源代码、pom.xml拷贝到local repository), 上传maven repository
    • test阶段需要写@Test的测试代码,并在pom.xml中添加依赖
      <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
        <scope>test</scope>  //表示只在本项目的test阶段有用,不会作为依赖一直传递下去
      </dependency>
      
  • 常用命令
    • mvn clean installmvn clean install -U 清空并下载
    • mvn dependency:tree 在pom.xml所在路径下终端中输入该命令,将依赖关系打印出来
  • 插件:
    • 插件是什么: maven其实是一套框架,所有的具体任务都是插件完成(编译、测试、打包、拷贝)的。除了核心的编译打包等插件,还有非常多的别的目的的插件。
    • 比如打出fatjar插件
      • 什么是fatjar:使用jar工具打出来的jar包只包含自己所写的源文件,对maven依赖的jar包是不包含在其中的,这样将jar包换到另一个平台,如果没有下载依赖的jar包,程序是运行不起来的。为了能将源文件和依赖的jar包打包到一起,就可以使用fatjar插件(也有叫all in one的)
      • 插件在pom.xml文件中的<build><plugins><plugin></plugin></plugins></build>中,如下:
            <build>
                <plugins>
                    <plugin>
                        <artifactId>maven-assembly-plugin</artifactId>
                        <configuration>
                            <descriptorRefs>
                                <descriptorRef>jar-with-dependencies</descriptorRef>
                            </descriptorRefs>
                            <archive>
                                <manifest>
                                    <mainClass>在这里指定项目的主类,也就是有main方法的类</mainClass>
                                </manifest>
                            </archive>
                        </configuration>
                        <executions>
                            <execution>
                                <id>make-assembly</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>single</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        

附录1-一个使用了插件进行fat-jar打包,并配置了阿里云仓库镜像的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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>tensor-zhang</groupId>
    <artifactId>guaiguaiMaven</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <name>helloMaven</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <encoding>UTF-8</encoding>
        <java.version>1.8</java.version>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>28.0-jre</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>5.2.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                    <archive>
                        <manifest>
                            <mainClass>在这里指定项目的主类,也就是有main方法的类</mainClass>
                        </manifest>
                    </archive>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>  //插件的运行阶段,注释需删除
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>alimaven</id>
            <name>aliyun maven</name>
            <url>http://maven.aliyun.com/nexus/content/groups/public/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

</project>
  • 使用mvn clean install -U后,打包后的jar就保存到了终端显示的位置(默认就是.m2的repository下),同时idea项目的target下也有会相应的jar包

附录2-java运行jar包

  • jar包能直接通过java -jar xxx.jar运行,需要满足:
    • 1、在jar包中的META-INF/MANIFEST.MF中指定Main-Class(比如附录1中在plugins中指定项目的主类),这样才能确定程序的入口在哪里;
    • 2、要能加载到依赖包。

附录3-不使用maven导入jar包的方法

NoClassDefFoundError: org/openjdk/jol/info/ClassLayout

posted @ 2022-05-25 01:16  tensor_zhang  阅读(46)  评论(0编辑  收藏  举报