程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(3)

Maven_项目构建及相关基础

发布于2020-11-19 21:03     阅读(364)     评论(0)     点赞(30)     收藏(2)


1.关于maven

1.1.简介

​ Maven是apache下的一个开源项目,是纯java开发的,主要作用于管理java项目。Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具

1.2.好处与功能

  1. 依赖管理:就是对jar包的同一管理 可以节省空间
    • 想要找到对应的jar包就需要给坐标,坐标的写法:哪个公司或组织+哪个项目+哪个版本
  2. 项目构建
    • 项目的一键构建指的是项目从 编译----测试-----运行-----打包----安装 都交给maven进行管理,这个过程称为构建
  3. 跨平台(纯Java开发)
  4. 应用于大型项目可以提高开发效率
    • maven的分模块开发:每个模块都单独开发,在用maven的时候改变单独模块的源码不需要去同时编译别的模块

1.3.Maven的安装

官方下载

官方地址

1.3.1.安装教程

  1. 先安装jdk,要求1.7版本以上

  2. 把maven软件解压缩,解压目录最好不要有中文
    在这里插入图片描述

  3. 配置环境变量MAVEN_HOME,变量值就是maven的解压路径

在这里插入图片描述

  1. 配置环境变量PATH,将%MAVEN_HOME%\bin加入Path中,在Windows中一定要注意要用分号;与其他值隔开
    在这里插入图片描述

  2. 验证是否配置成功:打开cmd窗口,输入mvn –v看是否有版本信息弹出如下

在这里插入图片描述

1.3.2.Maven的配置

全局配置

​ 在你所在的Maven解压文件中settings.xml就是你的全局配置,可以直接改全局配置,但是更好的是可以直接写一个自己的用户配置

在这里插入图片描述

用户配置

​ 当运行完cmd的mvn –v之后会产生一个默认的maven目录:~/.m2/repository。

其中~表示当前用户路径C:\Users\ [UserName]

~/.m2/settings.xml是用户的配置文件(默认没有该文件,需要将全局配置文件拷贝过来在进行修改)

注意:一般本地仓库的地址不使用默认配置,通常情况下需要在用户配置中,配置新的仓库地址。

配置步骤

  1. 创建一个本地仓库目录,比如D:\Maven\repository

  2. 复制maven的全局配置文件到~/.m2目录下,即创建用户配置文件

  3. 修改maven的用户配置文件
    在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
	<!-- 本地仓库地址 -->
	<localRepository>D:\java\repository\maven_repository</localRepository>
  <!-- 修改镜像 -->
    <mirrors>
		<mirror>
			<id>nexus-aliyun</id>
			<mirrorOf>*</mirrorOf>
			<name>Nexus aliyun</name>
			<url>http://maven.aliyun.com/nexus/content/groups/public</url>
		</mirror> 
    </mirrors>
	<profiles>
		<profile>       
			 <id>jdk-1.8</id>       
			 <activation>       
					 <activeByDefault>true</activeByDefault>       
					 <jdk>1.8</jdk>       
			 </activation>       
			 <properties>       
					 <maven.compiler.source>1.8</maven.compiler.source>       
					 <maven.compiler.target>1.8</maven.compiler.target>       
					 <maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>       
			 </properties>       
		</profile> 
  </profiles>
</settings>

2.Maven入门

2.1.maven的三种仓库

  • 本地仓库:自己维护
  • 远程仓库(私服):公司维护
  • 中央仓库:maven团队维护

三种仓库的关系图
在这里插入图片描述

2.2.Maven的目录结构

Project

|-src

| |-main

| | |-java —— 存放项目的.java文件

| | |-resources —— 存放项目资源文件,如spring, hibernate配置文件

| |-test

| |-java ——存放所有测试.java文件,如JUnit测试类

| |-resources —— 测试资源文件

|-target —— 目标文件输出位置例如.class、.jar、.war文件

|-pom.xml ——maven项目核心配置文件

注意:Maven的工程目录结构是固定的,如果不一样,会导致项目无法正常使用

2.2.1.eclipse创建maven工程

相对来说eclipse这个IDE工具使用率正在下降,所以可以参考以下文章

eclipse创建maven工程

2.2.2.IDEA创建Maven工程

  1. 配置
    在这里插入图片描述

  2. 创建项目
    在这里插入图片描述

    注意:可以不用选择模板直接创建即可

在这里插入图片描述

选择自动导入maven项目的改变

2.3.Maven指令

注意:

需要在pom.xml所在目录中执行以下命令

2.3.1.单个指令

mvn compile

​ 执行 mvn compile命令,完成编译操作

​ 执行完毕后,会生成target目录,该目录中存放了编译后的字节码文件。

mvn clean

​ 执行 mvn clean命令

​ 执行完毕后,会将target目录删除

mvn test

​ 执行 mvn test命令,完成单元测试操作

​ 执行完毕后,会在target目录中生成三个文件夹:surefire、surefire-reports(测试报告)、test-classes(测试的字节码文件)

mvn package

​ 执行 mvn package命令,完成打包操作

​ 执行完毕后,会在target目录中生成一个文件,该文件可能是jar、war

mvn install

​ 执行 mvn install命令,完成将打好的jar包安装到本地仓库的操作

​ 执行完毕后,会在本地仓库中出现安装后的jar包,方便其他工程引用

2.3.2.组合指令

mvn clean compile命令

​ cmd 中录入 mvn clean compile命令

​ 组合指令,先执行clean,再执行compile,通常应用于上线前执行,清除测试类

mvn clean test命令

​ cmd 中录入 mvn clean test命令

​ 组合指令,先执行clean,再执行test,通常应用于测试环节

mvn clean package命令

​ cmd 中录入 mvn clean package命令

​ 组合指令,先执行clean,再执行package,将项目打包,通常应用于发布前

执行过程:

​ 清理————清空环境

​ 编译————编译源码

​ 测试————测试源码

​ 打包————将编译的非测试类打包

mvn clean install命令

​ cmd 中录入 mvn clean install 查看仓库,当前项目被发布到仓库中

​ 组合指令,先执行clean,再执行install,将项目打包,通常应用于发布前

执行过程:

​ 清理————清空环境

​ 编译————编译源码

​ 测试————测试源码

​ 打包————将编译的非测试类打包

​ 部署————将打好的包发布到资源仓库中

跳过测试

​ 指令:-Dmaven.test.skip=true

​ ==执行方式:==mvn package -Dmaven.test.skip=true

3.Maven核心

3.1.坐标

什么是坐标?

​ 在平面几何中坐标(x,y)可以标识平面中唯一的一点。在maven中坐标就是为了定位一个唯一确定的jar包

​ Maven世界拥有大量构建,我们需要找一个用来唯一标识一个构建的统一规范拥有了统一规范,就可以把查找工作交给机器

3.1.1.坐标的组成

maven的坐标由以下三个部分组成

  1. groupId:定义当前Maven组织名称
  2. artifactId:定义实际项目名称
  3. version:定义当前项目的当前版本

3.2.依赖管理

​ 就是对项目中jar 包的管理。可以在pom文件中定义jar包的GAV坐标,管理依赖。

依赖声明主要包含如下元素:

​ 如下所示

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

3.3.依赖范围

在这里插入图片描述

其中依赖范围scope 用来控制依赖和编译,测试,运行的classpath的关系. 主要的是三种依赖关系如下:

  1. compile: 默认编译依赖范围。对于编译,测试,运行三种classpath都有效
  2. test:测试依赖范围。只对于测试classpath有效
  3. provided:已提供依赖范围。对于编译,测试的classpath都有效,但对于运行无效。因为由容器已经提供,例如servlet-api
  4. runtime:运行时提供。例如:jdbc驱动

3.4.依赖传递

​ 假设我们在项目中引用了某个jar包,而这个jar包又需要另外一个jar包才可以运行,这个时候maven就会将这个所需要的jar包也导入进来,这个就是依赖传递

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JH0TrcU3-1605623075086)(img/12.png)]

如果B中使用A,C中使用B,则称B是C的直接依赖,而称A是C的间接依赖

C->B B->A

C直接依赖B

C间接依赖A

3.5.依赖冲突

  • 如果直接与间接依赖中包含有同一个坐标不同版本的资源依赖,以直接依赖的版本为准==(就近原则)==
  • 如果直接依赖中包含有同一个坐标不同版本的资源依赖,以配置顺序下方的版本为准==(第一声明者优先原则)==

3.6.依赖排除

<dependency>
	  <groupId>junit</groupId>
	  <artifactId>junit</artifactId>
	  <version>4.12</version>
	  <scope>test</scope>
	  <exclusions>
           <exclusion>
               <artifactId>hamcrest-core</artifactId>
               <groupId>org.hamcrest</groupId>
           </exclusion>			
	 </exclusions>
</dependency>

排除依赖包中所包含的依赖关系,不需要添加版本号

如果在本次依赖中有一些多余的jar包也被传递依赖过来,如果想把这些jar包排除的话可以配置exclusions进行排除

在idea中有maven helper插件可以更方便的管理和排除依赖,直接在idea的插件部分搜索即可

4.关于Maven的生命周期

4.1.什么是生命周期?

Maven生命周期就是为了对所有的构建过程进行抽象和统一。包括项目清理、初始化、编译、打包、测试、部署等几乎所有构建步骤。

生命周期可以理解为构建工程的步骤。

在Maven中有三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:

  • Clean Lifecycle: 在进行真正的构建之前进行一些清理工作
  • Default Lifecycle: 构建的核心部分,编译,测试,打包,部署等等
  • Site Lifecycle: 生成项目报告,站点,发布站点

​ 再次强调一下它们是相互独立的,你可以仅仅调用clean来清理工作目录,仅仅调用site来生成站点。当然你也可以直接运行 mvn clean install site 运行所有这三套生命周期

​ 所谓的组合指令也是组合三个不同生命周期的指令

4.2.Maven三大生命周期

clean:清理项目

​ 每套生命周期都由一组阶段(Phase)组成,我们平时在命令行输入的命令总会对应于一个特定的阶段。比如,运行mvn clean ,这个的clean是Clean生命周期的一个阶段。有Clean生命周期,也有clean阶段。Clean生命周期一共包含了三个阶段:

pre-clean 执行一些需要在clean之前完成的工作 
clean 移除所有上一次构建生成的文件 
post-clean 执行一些需要在clean之后立刻完成的工作 

​ mvn clean 中的clean就是上面的clean,在一个生命周期中,运行某个阶段的时候,它之前的所有阶段都会被运行,也就是说,mvn clean 等同于 mvn pre-clean clean ,如果我们运行 mvn post-clean ,那么 pre-clean,clean 都会被运行。这是Maven很重要的一个规则,可以大大简化命令行的输入

default:构建项目

​ Default生命周期是Maven生命周期中最重要的一个,绝大部分工作都发生在这个生命周期中。这里,只解释一些比较重要和常用的阶段

validate 
generate-sources 
process-sources 
generate-resources 
process-resources 复制并处理资源文件,至目标目录,准备打包。 
compile 编译项目的源代码。 
process-classes 
generate-test-sources 
process-test-sources 
generate-test-resources 
process-test-resources 复制并处理资源文件,至目标测试目录。 
test-compile 编译测试源代码。 
process-test-classes 
test 使用合适的单元测试框架运行测试。这些测试代码不会被打包或部署。 
prepare-package 
package 接受编译好的代码,打包成可发布的格式,如 JAR 。 
pre-integration-test 
integration-test 
post-integration-test 
verify 
install 将包安装至本地仓库,以让其它项目依赖。 
deploy 将最终的包复制到远程的仓库,以让其它开发人员与项目共享。

运行任何一个阶段的时候,它前面的所有阶段都会被运行,这也就是为什么我们运行mvn install 的时候,代码会被编译,测试,打包。此外,Maven的插件机制是完全依赖Maven的生命周期的,因此理解生命周期至关重要

site:生成项目站点

Site生命周期

pre-site 执行一些需要在生成站点文档之前完成的工作 
site 生成项目的站点文档 
post-site 执行一些需要在生成站点文档之后完成的工作,并且为部署做准备 
site-deploy 将生成的站点文档部署到特定的服务器上 

这里经常用到的是site阶段和site-deploy阶段,用以生成和发布Maven站点,这可是Maven相当强大的功能,Manager比较喜欢,文档及统计数据自动生成,很好看

5.Maven插件

​ Maven的核心仅仅定义了抽象的生命周期,具体的任务都是交由插件完成的。每个插件都能实现一个功能,每个功能就是一个插件目标。Maven的生命周期与插件目标相互绑定,以完成某个具体的构建任务。

例如compile就是插件maven-compiler-plugin的一个插件目标

插件内容的写法(在pom.xml文件中修改)

<build>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<encoding>UTF-8</encoding>
				</configuration>
			</plugin>
		</plugins>
	</build>

修改配置文件后,在工程中更新maven即可

5.1.常见maven的依赖

<?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.zhiyou</groupId>
    <artifactId>iportal</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>

        <!-- junit start -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.0.5.RELEASE</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

        <!-- java web begin -->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>

        <dependency>
            <groupId>javax.servlet.jsp</groupId>
            <artifactId>jsp-api</artifactId>
            <version>2.2</version>
            <scope>provided</scope>
        </dependency>
        <!-- java web end -->

        <!-- mysql驱动 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.20</version>
            <scope>runtime</scope>
        </dependency>

        <!-- 数据库连接池 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.9</version>
        </dependency>

        <!-- spring jdbc -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.0.5.RELEASE</version>
        </dependency>

        <!-- mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>

        <!-- spring mybatis -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.2</version>
        </dependency>

        <!-- mybatis 分页插件 -->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.4</version>
        </dependency>

        <!-- 处理bean对象 -->
        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
            <version>1.9.3</version>
        </dependency>

        <!-- 文件上传 -->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.3</version>
        </dependency>

    </dependencies>
</project>

6.Log4j

6.1.简介

Log4j是Apache的一个开放源代码项目,通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、邮箱等;我们也可以控制每一条日志的输出格式

通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。最令人感兴趣的就是,这些可以通过一个配置文件来灵活地进行配置,而不需要修改应用的代码

应用场景

本地开发中IDE可以直接控制台输出(菜鸟的行为),可是程序在远程服务器上如何查看呢?通过log4j,可以配置项目以文件日志形式输出

日志级别

log4j有多种日志级别OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL,

推荐使用的为4个等级 从高到底ERROR, WARN, INFO,DEBUG

建议:

测试服务器:INFO,会输出ERROR,WARN,INFO三个等级的日志信息

正式服务器:ERROR 可以定义为ERROR等级,提高性能

开发环境: DEBUG 方便调试

可以配置全局的日志级别,也可以为某个类单独配置日志级别

日志输出:

日志可以输出到多种终端,比如到控制台,文件(可以每天创建一个日志文件),邮箱等。比如正式数据库突然无法连接了,可以把错误日志发送到指定邮箱,提醒相关人员赶紧检查原因

6.2.配置使用

  1. 引入依赖

    <dependency>
    	<groupId>log4j</groupId>
    	<artifactId>log4j</artifactId>
    	<version>1.2.16</version>
    </dependency>
    
  2. 添加配置文件

    在resources目录下添加log4j.properties,(非maven项目可以放在默认的src目录下)

    #全局配置
    log4j.rootLogger=debug,console, file
    #debug 测试阶段使用
    #info 上线
    #控制台日志输出
    log4j.appender.console=org.apache.log4j.ConsoleAppender
    log4j.appender.console.layout=org.apache.log4j.PatternLayout
    log4j.appender.console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %l %m %n
    
    #输出到文件
    log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
    log4j.appender.file.File=./logs/access.log
    log4j.appender.file.DatePattern='_'yyyyMMdd'.log'
    log4j.appender.file.encoding=UTF-8
    log4j.appender.file.layout=org.apache.log4j.PatternLayout
    log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} [%p] %l %m%n
    #追加模式记录日志
    log4j.appender.file.Append=true
    

原文链接:https://blog.csdn.net/qq_45366447/article/details/109756324



所属网站分类: 技术文章 > 博客

作者:javagogogo

链接:http://www.javaheidong.com/blog/article/935/54a5d24d071307447a98/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

30 0
收藏该文
已收藏

评论内容:(最多支持255个字符)