Maven的pom.xml文件配置,热步署(九)

古语有云: 万恶淫为首,百善孝为先。 我们后辈当自勉。

上一章简单介绍了 Maven聚合SSM项目(八),如果没有看过,请观看上一章

一. Maven 的 pom.xml 文件配置

在 Maven构建的项目中,最重要的就是 pom.xml 文件, 在pom.xml 里面 定义了项目的信息,其父项目的信息(如果有父项目的话), 各种依赖jar包, 各种插件工具等, 所以掌握 pom.xml文件里面的标签是很有必要的。

pom.xml 的主要标签有:

<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>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <packaging>...</packaging>
    <dependencies>...</dependencies>
    <parent>...</parent>
    <dependencyManagement>...</dependencyManagement>
    <modules>...</modules>
    <properties>...</properties>
    
    <!-- 构建过程的设置 -->
    <build>...</build>
    <reporting>...</reporting>
    
    <!-- 项目信息设置 -->
    <name>...</name>
    <description>...</description>
    <url>...</url>
    <inceptionYear>...</inceptionYear>
    <licenses>...</licenses>
    <organization>...</organization>
    <developers>...</developers>
    <contributors>...</contributors>
    
    <!-- 环境设置 -->
    <issueManagement>...</issueManagement>
    <ciManagement>...</ciManagement>
    <mailingLists>...</mailingLists>
    <scm>...</scm>
    <prerequisites>...</prerequisites>
    <repositories>...</repositories>
    <pluginRepositories>...</pluginRepositories>
    <distributionManagement>...</distributionManagement>
    <profiles>...</profiles>
</project>

其中, project标签是 根标签,后面跟一些约束。

modelVersion 为模型版本号,指定 pom.xml 符合哪个版本的描述符。maven 2 和 3 只能为 4.0.0。

一.一 Maven项目的基本设置

	<groupId>...</groupId>
    <artifactId>...</artifactId>
    <version>...</version>
    <packaging>...</packaging>

groupId 为公司名,通常是域名的反写。 artifactId 为项目名,version 为版本号, 有 SNAPSHOT (快照), LATEST (指某个特定构件的最新发布),RELEASE(最后一个发布版)

packaging为打包方式,有 jar,war,pom 等形式。

一.二 dependencies 元素

dependencies 元素下面有很多个 dependency 元素, dependency 里面对应着各自的依赖坐标。 如:

<dependencies>
  	<dependency>
  		<groupId>javax.servlet</groupId>
  		<artifactId>jsp-api</artifactId>
  		<version>2.0</version>
  		<scope>provided</scope>
  	</dependency>
  	<dependency>
  		<groupId>javax.servlet</groupId>
  		<artifactId>servlet-api</artifactId>
  		<version>2.5</version>
  		<scope>provided</scope>
  	</dependency>
  </dependencies>

其中,在dependency 元素里面, groupId, artifactId,version 是依赖的坐标信息, scope为依赖的范围。

除了以上的四个子节点之外,还有其他的信息

<dependency>
     <groupId>org.apache.maven</groupId>
      <artifactId>maven-embedder</artifactId>
      <version>2.0</version>
      <type>jar</type>
      <scope>test</scope>
      <optional>true</optional>
      <exclusions>
        <exclusion>
          <groupId>org.apache.maven</groupId>
          <artifactId>maven-core</artifactId>
        </exclusion>
      </exclusions>
   </dependency>

optional指的是 让其他项目知道,当您使用此项目时,您不需要这种依赖性才能正常工作。

exclusions 指的是,去除某些依赖,排除依赖。 如在 SSH项目中: struts2不添加 javassist 依赖 。

<!-- struts2依赖 -->
		<dependency>
			<groupId>org.apache.struts</groupId>
			<artifactId>struts2-core</artifactId>
			<version>2.3.24</version>
			<exclusions>
				<exclusion>
					<groupId>javassist</groupId>
					<artifactId>javassist</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

关于这些坐标的信息,可以去官网搜索。 如何搜索,可以看老蝴蝶以前写的文章。

一.三 parent 元素

Maven 各个项目之间,可以进行继承,也可以进行聚合, 其中,聚合也是一种特殊的继承,会有一种父级。 如在上一章的 聚合项目里面, CommonUtils 的父级是 SSMParent 一样。 Maven继承时,是单继承

 <parent>
    <groupId>com.yjl</groupId>
    <artifactId>SSMParent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>CommonUtils</artifactId>

在 parent 元素里面, 需要指定一下 父级的坐标信息。

当指定了父级的坐标信息之后,就不需要指定子级即自身的 groupdId 和version 的信息了,默认与父级是相同的。 当然,如果不一样的话,也是可以指定的。

 <parent>
    <groupId>com.yjl</groupId>
    <artifactId>SSMParent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
 <groupId>com.laohudie</groupId>
  <artifactId>CommonUtils</artifactId>
<version>0.0.2-SNAPSHOT</version>

这个时候, CommonUtils 的公司名 就是 com.laohudie, 版本号就是 0.0.2-SNAPSHOT . 没有指定时,才与父级是相同的。

parent 元素里面,还有一个 relativePath 元素。

<parent>
    <groupId>com.yjl</groupId>
    <artifactId>SSMParent</artifactId>
    <version>0.0.1-SNAPSHOT</version>	
	<relativePath>../SSMParent</relativePath>
  </parent>

relativePath: 父项目的pom.xml文件的相对路径。相对路径允许你选择一个不同的路径。默认值是…/pom.xml。Maven首先在构建当前项目的地方寻找父项目的pom,其次在文件系统的这个位置(relativePath位置),然后在本地仓库,最后在远程仓库寻找父项目的pom.
一般情况下,是不需要写的。

一.四 dependencyManagement 元素

dependencyManagement 依赖管理器, 可以在里面定义 一些依赖的信息, 但并不会实际下载和引用对应的依赖。 在 dependency 节点里面, 只需要定义相应的 groupId 和 artifactId 的信息即可, 版本号会自动从 dependencyManagement 里面拿。 但如果 dependency里面定义了版本号,那么就用 dependency里面的版本号。 这个常常发生于 父子 继承项目之间,为了统一管理依赖包的版本,确保所有子项目使用的版本一致。 类似的还有plugins和pluginManagement。 但用的不多, 现在喜欢用 properties 元素来 管理版本号。

一.五 modules 元素

在聚合项目开发时,用于指定这个项目下有哪些模块

如 SSMParent 的下有 CommonUtils 和SSMOA 模块,那么在 SSMParent 的pom.xml 里面 就显示:

 <modules>
  	<module>CommonUtils</module>
  	<module>SSMOA</module>
  </modules>

在SSMOA 下面有 SSMPojo, SSMDao,SSMService, SSMWeb, 那么在 SSMOA 的pom.xml 里面就显示:

 <modules>
  	<module>SSMPojo</module>
  	<module>SSMDao</module>
  	<module>SSMService</module>
  	<module>SSMWeb</module>
  </modules>

一.六 properties 元素

可以用 properties 来定义一些属性,可以在pom.xml的任意位置 进行引用, 用${propertie} 来进行引用。 通常用于控制 依赖的版本号。

如在 SSM 项目里面:

   <properties>
 	 <springframework.version>4.2.4.RELEASE</springframework.version>
 </properties>

在依赖引用时:

	<!-- spring web依赖 -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-web</artifactId>
		<version>${springframework.version}</version>
	</dependency>
	<!-- spring-aspects依赖 -->
	<dependency>
		<groupId>org.springframework</groupId>
		<artifactId>spring-aspects</artifactId>
		<version>${springframework.version}</version>
	</dependency>

一.七 build 元素

里面常用的有两种子标签, 一种是 resources (资源) 一种是 plugins (插件) 如 SSM里面。

1 . resources


		<resources>
			<!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉。 -->
			<resource>
				<directory>src/main/java</directory>
				<includes>
					<include>**/*.properties</include>
					<include>**/*.xml</include>
				</includes>
				<filtering>false</filtering>
			</resource>
			<resource>
				<directory>src/main/resources</directory>
				<includes>
					<include>**/*.properties</include>
					<include>**/*.xml</include>
				</includes>
				<filtering>false</filtering>
			</resource>
		</resources>

其中, directory 表示的是定义资源的路径, 默认的是:${basedir}/src/main/resources,

include 表示包括哪些, ** 表示任意目录

除了include, 还有一个 exclude, 排除哪些, 放置在 excludes 节点里面。

2 . plugins 插件

这是配置 tomcat的插件

	<plugins>
		<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<!--tomcat的插件名, tomcat7-maven-plugin, 用的是tomcat7版本 -->
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<port>8026</port>  <!--tomcat的端口号 -->
					<path>/ssm</path> <!--tomcat的项目名 -->
					<uriEncoding>UTF-8</uriEncoding> <!-- 防止get 提交时乱码 -->
				</configuration>
		</plugin>
	</plugins>

这是配置 jdk编译版本的插件

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <extensions>true</extensions> 
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
    </configuration>
</plugin>

关于 Maven 插件的更多详细资料,可以参考 Aviva_ye 前辈的文章: [maven] 常用插件解析

一.八 其他配置

还有一些其他的配置, 如项目信息配置和环境配置, 目前没有用到,老蝴蝶也不会,所以就不讲解了。

如果想更多了解, 可以看 菜鸟编程的 Maven 部分: Maven POM

二. Maven的热步署

我们在用 Tomcat步署工程的时候,需要先将Tomcat 关闭,然后将打包好的 .war工程放置到 Tomcat的webapp下, 再重新启动 Tomcat, 在将war项目放置到tomcat的这段时间内,是无法访问该项目的,会报404的错误。

而 Maven的热步署, 可以很方便的解决这一点, 它可以在 Tomcat的运行期间,不需要将Tomcat关闭,重新启动,就可以直接更新项目,这就是 Maven的热步署。 Maven的步署,可以远程步署,也可以本地步署,两者是一样的。 Maven在步署的时候,需要获取Tomcat的权限,经过Tomcat同意之后,才可以进行步署,而让Tomcat同意,就像Mysql数据库一样,给其正确的用户名和密码就可以了。 (当然,用户还需要具有某些角色)

二.一 在Tomcat 目录下 conf/tomcat-users.xml 下添加角色

如果不是采用Eclipse开发, 需要在Tomcat的安装目录下的conf/tomcat-users.xml 文件里面, 添加角色用户

<!--Maven热步署的权限-->
<role rolename="manager-gui"/>
<role rolename="manager-script"/>
<user username="tomcatReploy" password="tomcatReploy" roles="manager-gui, manager-script"/>

tomcat默认添加的那些权限,可以给其放开,也可以不管。 最好是不管。 (密码已经改成tomcat了)

<role rolename="tomcat"/>
  <role rolename="role1"/>
  <user username="tomcat" password="tomcat" roles="tomcat"/>
  <user username="both" password="tomcat" roles="tomcat,role1"/>
  <user username="role1" password="tomcat" roles="role1"/>

如果采用的是Eclipse 开发, 需要改变 Servers 项目下面的 tomcat-users.xml 文件

有图片

添加的内容,与上面的一致。

输入网址: http://localhost:8027/    (老蝴蝶的端口号是8027)

会出现 Tomcat 的启动页面, 点击 Manager App 按钮

有图片

填写刚才 的用户名和密码 tomcatReploy, tomcatReploy

出现这个页面,

有图片

即说明配置 用户成功了

如果是本地热步署,就修改本地的 tomcat配置文件, 如果是远程步署,就修改远程服务器上的tomcat的配置文件。

二.二 Maven项目的 pom.xml 文件中 tomcat插件配置

我们仍然采用以前的 ServletMaven 项目,即 Maven创建一个Servlet项目(五) 的项目。

在 pom.xml 的tomcat插件中,进行配置

<plugin>
		<groupId>org.apache.tomcat.maven</groupId>
		<!--tomcat的插件名, tomcat7-maven-plugin, 用的是tomcat7版本 -->
		<artifactId>tomcat7-maven-plugin</artifactId>
		<version>2.2</version>
		<configuration>
			<!--  <port>8026</port>-->  <!--tomcat的端口号 -->
			<!--<path>/servlet</path>--> <!--tomcat的项目名 -->
			<uriEncoding>UTF-8</uriEncoding> <!-- 防止get 提交时乱码 -->
			<username>tomcatReploy</username>
			<password>tomcatReploy</password>
			<url>http://localhost:8027/manager/text</url>
		</configuration>
</plugin>

多添加一个 username,password,和url 的节点编号, 其中 url 前面部分是 网址, 本地的话就是http://localhost:8027/

如果是远程的话, 就是 远程服务器的ip+端口号, /manager/text 是不能改变 的。

我们将原先的 port 和path 先注释掉。

二.三 测试运行

在本地的 Tomcat 目录下,目前是没有 ServletMaven 这个项目的。
在这里插入图片描述

1 .现在,Tomcat服务器还没有启动,

在Maven 项目, 选中 ServletMaven , 进行运行 ,输入命令 tomcat7:deploy (第一次步署,是tomcat7:deploy, 再次步署就是 tomcat7:redeploy)
在这里插入图片描述
控制台打印错误

有图片

具体信息是:

[ERROR] Failed to execute goal org.apache.tomcat.maven:tomcat7-maven-plugin:2.2:deploy (default-cli) on project ServletMaven: Cannot invoke Tomcat manager: Connection refused: connect -> [Help 1]

说 Tomcat 未连接, 先要启动Tomcat

2 .在 Tomcat安装路径/bin/startup.bat 命令,启动服务器后,

再次执行刚才的命令: tomcat&:deploy

控制台打印输出:

有图片

Maven 启动是正确的。

在Tomcat 安装目录下 webapps 也出现了 ServletMaven 项目和及对应的 .war包

有图片

说明安装到 Tomcat上了。

访问路径: http://localhost:8027/ServletMaven/hello

展示了回显信息

有图片

这个时候,重新修改 HelloServlet.java 的内容

将回显信息改成

@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		String message="你好啊,两个蝴蝶飞";
		req.setAttribute("message",message);
		req.getRequestDispatcher("/index.jsp").forward(req,resp);
	}

这个时候,重新运行 ServletMaven 项目,选择 Maven build … 输入命令: clean tomcat7:redeploy

有图片

控制台没有报错, 前台刷新页面 :

有图片

重新步署成功, 就不需要再 关闭Tomcat, 重新放置到Tomcat, 再运行Tomcat了。

二.四 将以前的 port和 path 重新添加

<plugin>
				<groupId>org.apache.tomcat.maven</groupId>
				<!--tomcat的插件名, tomcat7-maven-plugin, 用的是tomcat7版本 -->
				<artifactId>tomcat7-maven-plugin</artifactId>
				<version>2.2</version>
				<configuration>
					<port>8026</port>  <!--tomcat的端口号 -->
					<path>/servlet</path> <!--tomcat的项目名 -->
					<uriEncoding>UTF-8</uriEncoding> <!-- 防止get 提交时乱码 -->
					<username>tomcatReploy</username>
					<password>tomcatReploy</password>
					<url>http://localhost:8027/manager/text</url>
				</configuration>
			</plugin>

这个时候,再 重新运行 clean tomcat7:redeploy 命令

控制台也没有报错

Tomcat的方式运行: http://localhost:8027/ServletMaven/hello

可以显示

Maven 方式的运行 (命令是 tomcat7:redeploy): http://localhost:8026/servlet/hello

是错误的。 说连接被重置

将输入的命令改成 clean tomcat7:run 时

有图片

说明是不行的。 这也就是为什么说 远程步署,而不是本地步署的原因。 如果url 是远程的话,将不会有这个问题。

如果将端口去掉, 保留 path, 那么是可以的, 这个时候,生成的名称是 servlet

有图片

输入本地的: http://localhost:8027/servlet/hello 是可以的

输入Maven 的( 命令是: tomcat7:run) http://localhost:8080/servlet/hello 是可以的

也就是说, 本地的热步署时,可以添加 path, 不要指定 port

谢谢!!!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

两个蝴蝶飞

你的鼓励,是老蝴蝶更努力写作的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值