Java Web开发入门 - 第4章 Maven实战

#Maven Maven官网
Maven下载 Maven安装配置 #Maven安装 ##Windows安装 ###配置Java

  • 下载JRE或者JDK
  • 配置JAVA_HOME环境变量到JRE或者JDK的根目录 ###下载并解压Maven
  • Maven官网下载压缩包,解压缩
  • 配置M2_HOME环境变量 ##Ubuntu安装
sudo apt-get install maven

##CentOS安装

yum install maven

##Mac OS X安装

brew insall maven3

##二进制安装 #Maven实战 ##Maven核心概念

##人肉式

  • 手动编译
  • 手动打war包
  • 手动复制war包运行

##IDE ###eclipse

  • 下载依赖包:去哪里下载
  • 编写源代码、配置文件 目录结构怎么定
  • 编译、测试、打包、发行 构建流程不统一
  • 项目代码共享以及依赖
  • 各种依赖的版本管理
  • 远程部署问题 ##Maven是什么
  • Apache基金会出品
  • 开源
  • Java编写 通常把Maven理解成项目构建和依赖管理工具

##为什么是Maven

  • 约定(惯例)优先原则
  • 三方依赖管理 - 提供远程仓库,解决了依赖维护
  • 提供一致的项目构建管理方式 - 减少构建工作量
  • 插件式架构,大量的可重用插件
  • 方便集成IDE
  • 开源项目使用Maven

##Maven安装

##pom.xml

  • groupId 组织
  • artifactId 项目
  • version 版本

上面三个称为Maven项目的唯一标示

  • packaging 打包类型
  • dependencies 依赖项目
<?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 组织,使用java包式描述 -->
    <groupId>groupId</groupId>
<!-- artifactId 项目标识符(不要使用标点) -->
    <artifactId>TomcatStudy</artifactId>
<!-- 版本号SNAPSHOT会替换时间戳快照,发布 -->
    <version>1.0-SNAPSHOT</version>
<!-- 打包类型war或者jar -->
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>3.1.0</version>
<!-- 存在编译需要而发布不需要的jar包,可以用scope标签,值设为provided -->
<scope>provided</scope>
        </dependency>
    </dependencies>
</project>

##Maven基本命令

  • mvn archetype:generate - 使用模板生成项目
  • mvn compile 编译源代码
  • mvn test 跑单元测试
  • mvn package 打包应用
  • mvn deploy 部署
  • mvn site生成项目相关的文档站点
  • mvn clean 清理
  • mvn install 把包安装到本地仓库

##Maven Tomcat插件

  • Tomcat官方提供的一个Maven插件,用于方便应用和tomcat的开发运行调试
  • 详细帮助
    • mvn help:describe -Dplugin=tomcat7
  • 常见命令
    • mvn tomcat7:run 启动一个嵌入式的tomcat实例(在maven中)
    • mvn tomcat:deploy
  • *mvn tomcat:undeploy

#Maven Tomcat实践演示 确定maven工作正常

mvn

##Maven生成webapp项目 通过模板创建应用。在确定的项目目录内执行一下命令,创建规范的项目目录树:
命令如下:

mvn archetype:generate -DgroupId=com.netease.restaurant -DartifactId=Restaurant -Dpackage=com.netease -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp

打印如下,程序需要向我们进行确认:

zhanpeng@GE70:~/Workspace/maven/restaurant$ mvn archetype:generate -DgroupId=com.netease.restaurant -DartifactId=Restaurant -Dpackage=com.netease -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-webapp
[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] >>> maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom >>>
[INFO] 
[INFO] <<< maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom <<<
[INFO] 
[INFO] --- maven-archetype-plugin:2.4:generate (default-cli) @ standalone-pom ---
[INFO] Generating project in Interactive mode
[INFO] Using property: groupId = com.netease.restaurant
[INFO] Using property: artifactId = Restaurant
[INFO] Using property: version = 1.0.0-SNAPSHOT
[INFO] Using property: package = com.netease
Confirm properties configuration:
groupId: com.netease.restaurant
artifactId: Restaurant
version: 1.0.0-SNAPSHOT
package: com.netease
 Y: : 

输入y进行确认,确认之后我们查看目录结构。
我们可以看到如下目录树:

zhanpeng@GE70:~/Workspace/maven/restaurant$ tree
.
└── Restaurant
    ├── pom.xml
    └── src
        └── main
            ├── resources
            └── webapp
                ├── index.jsp
                └── WEB-INF
                    └── web.xml

6 directories, 3 files

补充建立目录并把之前项目的文件放置到正确位置:

zhanpeng@GE70:~/Workspace/maven/restaurant$ tree
.
└── Restaurant
    ├── pom.xml
    └── src
        ├── main
        │   ├── java
        │   │   └── com
        │   │       └── netease
        │   │           ├── HelloServlet.java
        │   │           └── NoodlesServlet.java
        │   ├── resources
        │   └── webapp
        │       ├── index.jsp
        │       ├── SoybeanMilk.html
        │       └── WEB-INF
        │           ├── web.xml
        └── test
            └── java

11 directories, 6 files

源代码参考之前代码 ##Maven添加依赖 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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.netease.restaurant</groupId>
  <artifactId>Restaurant</artifactId>
  <packaging>war</packaging>
  <version>1.0.0-SNAPSHOT</version>
  <name>Restaurant Maven Webapp</name>
  <url>http://maven.apache.org</url>
  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
    </dependency>
  </dependencies>
  <build>
    <finalName>Restaurant</finalName>
  </build>
</project>

##Maven添加插件

<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">
  ...
  <dependencies>
  ...
  </dependencies>
  <build>
    <finalName>Restaurant</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <uriEncoding>UTF-8</uriEncoding>
          <finalName>Restaurant</finalName>
          <server>tomcat</server>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

##maven-tomcat-plugin运行

mvn tomcat7:run

**注意:**课程给的例子是发生错误,由于serlvet包并没有添加<scope>provided</scope>,注意如下内容的修改:

    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>

运行测试

zhanpeng@GE70:~$ curl http://localhost:8080/Restaurant/noodles
<html><body>
<h1> Noodles with Tomato</h1>
</html></body>

#Maven管理多模块Web项目实战 之前的配置是单个项目,但是在后面的项目内容,更多的是分模块进行项目内容开发。这就涉及到多模块管理与依赖关系描述。多个项目相互依赖非常复杂,maven帮助我们管理多模块内容。 ##创建子模块

mvn archetype:generate -DgroupId=com.netease.restaurant -DartifactId=Kitchen -Dpackage=com.netease -Dversion=1.0.0-SNAPSHOT -DarchetypeArtifactId=maven-archetype-quickstart

我们可以看到目录树变更为:

zhanpeng@GE70:~/Workspace/maven/restaurant$ tree
.
├── Kitchen
│   ├── pom.xml
│   └── src
│       ├── main
│       │   └── java
│       │       └── com
│       │           └── netease
│       │               └── App.java
│       └── test
│           └── java
│               └── com
│                   └── netease
│                       └── AppTest.java
└── Restaurant
    ├── pom.xml
    ├── Restaurant.iml
    ├── src
    │   ├── main
    │   │   ├── java
    │   │   │   └── com
    │   │   │       └── netease
    │   │   │           ├── HelloServlet.java
    │   │   │           └── NoodlesServlet.java
    │   │   ├── resources
    │   │   └── webapp
    │   │       ├── index.jsp
    │   │       ├── SoybeanMilk.html
    │   │       └── WEB-INF
    │   │           ├── web.xml
    │   │           └── web.xml~
    │   └── test
    │       └── java

修改子模块代码

##管理两个子项目的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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.netease.restaurant</groupId>
  <artifactId>restarant-parent</artifactId>
  <version>1.0.0-SNAPSHOT</version>
  <packaging>pom</packaging> <!-- 管理子项目 -->
  <name>Multi modules demo</name>
  
  <modules>
    <module>Restaurant</module>
    <module>Kitchen</module>
  </modules>
</project>

备注:正确添加pom.xml文件之后,就可以使用idea打开多模块项目 ##修改子模块的pom.xml配置 Kitchen项目的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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.netease.restaurant</groupId>
  <artifactId>Kitchen</artifactId>
  <packaging>jar</packaging>
  <version>1.0.0-SNAPSHOT</version>
  <name>Kitchen</name>
  <url>http://maven.apache.org</url>

  <!-- 添加总管理依赖 -->
  <parent>
    <groupId>com.netease.restaurant</groupId>
    <artifactId>restarant-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <relativePath>../pom.xml</relativePath>
  </parent>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
  </dependencies>
</project>

Restaurant项目的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/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.netease.restaurant</groupId>
  <artifactId>Restaurant</artifactId>
  <packaging>war</packaging>
  <version>1.0.0-SNAPSHOT</version>
  <name>Restaurant Maven Webapp</name>
  <url>http://maven.apache.org</url>

  <!-- 添加总管理依赖 -->
  <parent>
    <groupId>com.netease.restaurant</groupId>
    <artifactId>restarant-parent</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <relativePath>../pom.xml</relativePath>
  </parent>

  <dependencies>
    <!-- 依赖Kitchen -->
    <dependency>
      <groupId>com.netease.restaurant</groupId>
      <artifactId>Kitchen</artifactId>
      <version>1.0.0-SNAPSHOT</version>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>javax.servlet-api</artifactId>
      <version>3.1.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>
  <build>
    <finalName>Restaurant</finalName>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
          <source>1.6</source>
          <target>1.6</target>
          <encoding>UTF-8</encoding>
        </configuration>
      </plugin>

      <plugin>
        <groupId>org.apache.tomcat.maven</groupId>
        <artifactId>tomcat7-maven-plugin</artifactId>
        <version>2.2</version>
        <configuration>
          <uriEncoding>UTF-8</uriEncoding>
          <finalName>Restaurant</finalName>
          <server>tomcat</server>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

注意:idea开启自动导入包,不然子项目包无法载入
##把包安装到本地仓库

mvn install

到web子项目启动运行:

mvn tomcat7:run

访问测试:

zhanpeng@GE70:~$ curl http://localhost:8080/Restaurant/hello
hello world
Hello Kitchen

确定子项目被加载进来 #eclipse方式使用maven ##eclipse安装maven插件 工具栏:help->Install New Software
eclipse neon无法安装插件 ##eclipse导入项目 选择项目
输入图片说明
确认导入项目信息
输入图片说明
项目导入成功
输入图片说明
##eclipse使用maven进行运行 需要执行的Web项目上右键->Run As->Run Configurations
双击Maven Build创建运行内容
输入图片说明
注意:Base Directory填写${workspace_loc:/Restaurant},Goals填写tomcat7:run
输入图片说明
点击运行,并确认运行结果

zhanpeng@GE70:~$ curl http://localhost:8080/Restaurant/hello
hello world
Hello Kitchen

#Maven FAQ Q: 我执行tomcat7插件相关的操作时,怎么一直报错,提示找不到tomcat7插件?
A: 这个是因为tomcat7插件的groupId不在maven默认的pluginGroups中,解决方法有一下几种:

  1. 在一个配置了tomcat7插件的项目目录下执行,因为配置了tomcat7插件,所有maven就知道了其groupId,所以就能够找到了
  2. 使用带groupId的全限定名,例子如下: mvn help:describe -Dplugin=org.apache.tomcat.maven:tomcat7-maven-plugin:2.2 由于在指定plugin的时候,写了完整的groupId,所以这样也是可以的
  3. 修改一下mvn的配置文件settings.xml, 在<pluginGroups> 这个配置项下面,增加一个<pluginGroup>配置即可 <pluginGroups> <pluginGroup>org.apache.tomcat.maven</pluginGroup> </pluginGroups>

想了解更多为什么会这样,请参考 http://maven.apache.org/guides/introduction/introduction-to-plugin-prefix-mapping.html

Q: 我在实战maven管理多项目的时候,执行mvn tomcat7:run 报了错误,错误信息是“The POM for com.netease.restaurant:Kitchen:jar:1.0.0-SNAPSHOT is missing, no dependency information available”,怎么办?

A: 在多项目管理实战中的这个例子中,Restaurant对Kitchen有依赖,如果你直接在Restaurant这个项目中执行 mvn tomcat7:run的话,由于此时Kitchen还没有放到本地仓库中,因此Restaurant找不到这个Kitchen的依赖,所以报错了。解决方案如下:
1.可以在Kitchen这个项目中执行 mvn install,此时会把这个Kitchen项目安装maven的本地仓库,然后再在Restaurant项目中引用,就能找到了
2.直接在顶层的 restaurant-parent 这个项目下先执行 mvn install,这样的话,顶层的这个父项目会把所有的子项目都安装到本地仓库,并维护好依赖关系

转载于:https://my.oschina.net/hava/blog/736350

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值