微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

maven的学习和使用

目录

maven的学习和使用

Maven的概念

Maven是什么

Maven实际上就是一个包管理工具
maven的引入:

  • 传统项目中出现的包与包之间的问题
    • 如果项目组A想使用项目组B的代码,需要项目组B将项目打包后再把jar文件拷贝给项目组A
    • 如果想要使用A的jar包,那么需要引入A的jar包,并且引入A依赖的jar包,再将依赖的jar包再依赖的jar包引入,这很容易导致出现漏jar包或者jar包冲突等问题
      综上两点问题。可以看出传统项目中我们使用jar不够方便。管理起来比较紊乱。那么有没有一款软件,能够帮我们干这件事呢?这时候maven就出现了。

Maven能干什么

  • 通过maven来导入第三方的jar包资源到项目当中

    • 以前我们需要一个jar包,需要自己去网上下载,并且放在我们项目当中。但是有了maven之后,我们只需要告诉maven我们需要的jar包,maven就会帮我们下载好,然后引入到我们所使用的项目当中。
  • 通过maven将自己的项目打包成jar包资源对外提供服务

    • 能够帮助我们将自己的项目打包,使得使用同一个本地仓库的同事也可以使用。如果发布到了网上,那么每个使用maven的程序员都可以引入该jar包使用。

使用Maven需要了解的几个知识点

项目的体系结构

项目的概念:处理同一个功能的java文件放在了一起,称之为一个java项目

  • javase阶段。这个阶段我们的项目结构只有一个src文件夹。我们在该文件夹写我们的源码。这个项目的体系结构我们是交由给JDK来进行解析和运行。

  • javaee阶段。也就是javaweb时候,我们的项目结构为src和一个web目录。这个项目的体系结构我们是交由给tomcat来进行解析和运行。

那么我们需要使用maven,而如何创建maven的体系结构呢。
  • 实现:使用maven来创建其对应的项目结构。
  • 这个时候还有一个问题: 既然是maven的项目结构,例如使用maven创建的是一个web项目,那么maven项目结构当然只有maven自己能够识别。那么我们如何让其能够在tomcat运行呢?
    • 解决:我们tomcat运行时,运行的是已经编译好的java等文件。那么只需要maven在编译我们项目时,将其编译成tomcat能够识别的javaee的项目体系结构,不就可以了。
    • 当然,maven也是这么做的。

Maven的专业术语

  • 本地仓库:也就是存储在本地硬盘中的第三方jar资源的路径地址
  • 云仓库: maven如果在本地仓库中没有找到对应的资源,那么则会到云仓库中去下载。
  • 资源坐标:maven查找一个第三方资源的定位地址。类似于URL,是唯一的。
    • 要不然一个资源坐标找到了2个资源,那么该给我们哪个?

Maven的安装和及配置

下载maven并完成解压

下载地址

解压后目录如下

image

配置本地仓库地址(配置的操作均在conf目录下的settings.xml文件中操作)

不配置也行的,配置idea的maven模块时,可以手动重新指定仓库。
放在settings.xml的55行空白处即可
<localRepository>D:/my_dev_tools/apache-maven-3.6.2/resp</localRepository>

配置云仓库地址

放在settings.xml的159行空白处即可

	<mirror>
		<id>alimaven</id>
		<name>aliyun maven</name>
		<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
		<mirrorOf>central</mirrorOf>
	</mirror>
  </mirrors>

配置java的编译版本(虽然编译后是给tomcat看,但是当然要和你tomcat使用的java编译版本一致)

放在settings.xml的219行空白处即可

	<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>

在IDEA中进行对maven的配置

打开设置并找到构建工具,Build Tools,再点击maven

image

配置maven的目录,配置文件的路径、仓库的路径

image

pom.xml的几个常见配置内容

dependencies标签,用于引入项目所需的第三方资源(jar)

// 对于需要引入的第三方资源,会先从本地仓库中寻找,如果本地仓库中没有,则会去云仓库中寻找
<dependencies>
    <dependency>
        <groupId></groupId>
        <artifactId></artifactId>
        <version></version>
    </dependency>
</dependencies>

properties 标签,第三方资源版本号管理

image

plugins标签,用于引入第三方插件

    <build>
        <plugins>
            <plugin>
                // 写插件的资源坐标
            </plugin>
        </plugins>
    </build>

Maven项目的创建以及特点

创建jar的项目

  • 创建新项目时选择maven项目

image

  • 创建时的注意事项

    image

  • 最后点击Finish完成即可

  • 项目结构

    image


    其中pom.xml是用于给maven看的,maven会解析其中的配置。例如解析其中的资源坐标,然后将资源引入到当前项目

特点

  • 其实创建一个jar类型的项目本质上相当于一个javase的项目
  • 该项目编译后,与javase的项目体系结构相同
  • 那个绿色的测试文件夹及其文件,不会被打包

创建war的项目

  • 除了第一步不一样,创建的步骤一致

    image

  • 在main文件夹下手动创建java和resources目录,并指定为源代码和资源根路径

    image


    image

特点

  • 编译后,与javaee的项目体系结构相同。能够被tomcat识别
  • 其他的同jar项目的特点

maven创建的war项目搭建基础的web开发环境

  • 问题:创建war的项目之后,连jsp都识别不了,并且没有Servlet的jar包,无法完成最基本的web开发。
  • 问题出现的原因:以前我们创建javaee项目的时候,会直接引入tomcat的jar包资源,而tomcat的jar包资源就包含识别jsp代码以及Servlet.api等等的jar包。但是我们直接创建的maven项目,并没有认引入这些jar包
  • 解决:引入servlet、jsp、jstl 的jar包 即可进行最基本的web开发。
    <!-- servlet的资源坐标 -->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

    <!-- jsp的资源坐标 -->
    <dependency>
      <groupId>javax.servlet.jsp</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.2</version>
      <scope>provided</scope>
    </dependency>

    <!-- jstl的资源坐标 -->
    <dependency>
      <groupId>jstl</groupId>
      <artifactId>jstl</artifactId>
      <version>1.2</version>
    </dependency>

war项目的本地启动运行

  • 问题:以前我们的javaee项目是在创建的时候就直接使用tomcat进行了部署,然后直接通过tomcat进行运行的。但是现在我们的项目由maven进行创建,虽然打包成war包后可以放入tomcat的webapps目录下直接运行(但是总不能每进行一部分功能代码的开发后都打包放入tomcat运行吧。)。
    所以我们在使用IDE进行功能开发时,如何能够运行war项目呢。
  • 解决:既然我们之前是使用tomcat部署之后直接运行java项目。那么能不能由maven去网上下来一个tomcat,然后我们使用下载下来的tomcat直接进行项目的运行测试呢? 答案是可以的。
  • 实现方案
    1. 首先需要在pom.xml中配置如下的tomcat插件并更新pom文件到项目中
        <build>
        <plugins>
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <!--配置tomcat启动的端口号-->
                    <port>8181</port>
                    <!--配置项目的访问名称-->
                    <path>/myFristMavenProject</path>
                </configuration>
            </plugin>
        </plugins>
    </build>
    

更改了项目的pom文件后,会弹出提示提示是否进行pom文件的更新。

image


2. 更新后可以在IDE工具中看到当前项目的插件有了tomcat

image


3. 运行测试

image

war项目在运行打包时,不会将java根路径下的除了java以外的资源打包问题

例如:mybaits的映射文件,xxx.xml不会被打包的解决方
解决:在pom.xml的bulid标签下进行资源配置

	<build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
                <filtering>true</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
    </build>

Maven 创建的项目打包到本地仓库

  • 创建一个maven项目(这里使用jar项目作为演示)

    image

  • 对maven项目进行打包

    image

  • 文件夹中找到打包后的jar包或war包

    image

maven项目间的依赖问题

现在我们知道了maven项目如何进行打包,那么打包之后如何被其他项目引用呢?
例如,如上打包的项目,其他项目只需要如下引用即可。(pom.xml中)

    <dependency>
      <groupId>com.it</groupId>
      <artifactId>maven_jar_demo</artifactId>
      <version>1.1-SNAPSHOT</version>
    </dependency>

在idea同一个工作空间下的maven项目间的依赖问题

一个问题,我们如果在idea的同一个工作空间下,创建了多个maven项目,那么项目之间在运行之前可以实现不用打包就能引用。意思就是,项目A在没有进行install打包时,项目B就可以将项目A的依赖加入到自己(B)的项目。
但是呢,实际运行时,还是会提示找不到依赖的,所以请务必不要忘记打包。

Maven项目之间的关系会出现的问题以及解决方

项目A想要使用到项目B的一个功能问题(聚合关系)

  • 通过以上maven的打包我们可以看到,maven的打包单位是针对一个项目,而这个时候项目组A只想要使用到项目B其中很小的一个功能,如果直接引入B现在的全功能jar包,而很多其他B项目的功能并不会使用到。就会造成资源的浪费
  • 解决思路:在看到spring官方向我们提供的jar包的时候可以看到,spring的每个功能都会分成不同的jar包。那么我们可不可以让maven在打包的时候帮我们把项目按照一个个的功能模块划分来打包呢。
  • 实现:maven关系之间有一种关系叫做聚合关系。通过聚合关系就可以解决问题(后面的内容会演示)
    聚合关系。指的是一个完整的项目按照功能模块进行了项目划分。例如 entity实体类项目。service业务层项目。mapper持久层项目。util工具类项目。 最后maven打包的时候帮我们进行这些拆分项目的整合(整合后再进行运行)。

项目A和项目B都使用到了相同的dependency依赖(继承关系)

  • 问题:2个maven项目,项目A和项目B在开发功能的时候,都引了相同的依赖。造成了代码的冗余。
  • 解决:抽取一个公共的maven项目用于做父项目(引入所需的依赖)。项目A和项目B都继承于这个公共的项目。(使用继承关系解决

一个聚合ssm项目目录结构(解决如上2个问题)

image


image

聚合项目的打包,用于运行的项目是jh_web,所以将该项目打包后的war放入tomcat可以直接运行

Maven创建的war项目的手动部署与自动部署到Linux系统当中

手动部署项目

先将maven创建的war项目进行打包install

将打包后的war项目放入linux系统的tomcat的webapps目录下

image

启动tomcat

通过linux系统的ip和项目名来访问项目

image

自动部署项目

为什么要自动部署项目:因为我们的项目不可能打包一次之后就不再修改,很可能会进行频繁的修改,那么每次修改打包之后,我们如果都手动打成war包,然后将其放入tomcat的webapps目录下,重启tomcat,那就非常的麻烦了。

Maven之前配置的一个tomcat插件可以帮助我们实现此功能

对项目运行的tomcat的tomcat-user.xml的配置文件进行如下的添加并重启taomcat

# 在没有注释的地方添加如下的代码
<role rolename="manager-gui"/>
<role rolename="manager-script "/>
<role rolename="manager-jmx"/>
<role rolename="manager-status"/>
<user username="admin" password="1234" roles="manager-gui,manager-script,manager-jmx,manager-status"/>

之后需要重启tomcat

配置tomcat,webapps/manager/meta-inf下的context.xml文件,注释掉如下语句

<!-- 该语句是限制访问的,如果不注释掉或者设置成你的ip,则会导致403
  <Valve className="org.apache.catalina.valves.RemoteAddrValve"
         allow="127\.\d+\.\d+\.\d+|::1|0:0:0:0:0:0:0:1" />
-->

配置Maven的tomcat插件

    <build>
        <plugins>
            <!-- 让maven去下载一个tomcat来运行当前项目 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <url>http://192.168.21.128:8080/manager/text</url>
                    <!-- 配置用户名密码-->
                    <username>admin</username>
                    <password>1234</password>
                    <charset>utf8</charset>
                    <!-- 是否更新 -->
                    <update>true</update>

                    <port>8877</port><!--配置tomcat启动的端口号,不适用于远程部署-->
                    <path>/myProject</path><!--配置项目的访问名称-->
                </configuration>
            </plugin>
        </plugins>
    </build>
当然,还有另外一种配置server的方式。其实就是将用户名密码配置到maven的配置文件

image

然后配置maven的插件(其实就是用户名密码换成了使用server)
    <build>
        <plugins>
            <!-- 让maven去下载一个tomcat来运行当前项目 -->
            <plugin>
                <groupId>org.apache.tomcat.maven</groupId>
                <artifactId>tomcat7-maven-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <url>http://192.168.21.128:8080/manager/text</url>
                    <!-- 配置用户名密码-->
                    <server>tomcat8</server>
                    <charset>utf8</charset>
                    <!-- 是否更新 -->
                    <update>true</update>

                    <port>8877</port><!--配置tomcat启动的端口号,不适用于远程部署-->
                    <path>/myProject</path><!--配置项目的访问名称-->
                </configuration>
            </plugin>
        </plugins>
    </build>

使用tomcat插件进行部署

image

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐