IDEA中使用Maven

Maven的安装与使用

安装

1、下载,官网下载。

2、解压,存放路径中不可包含空格和中文。如:"E:\dev\workspace\maven\apache-maven-3.6.0"

3、配置本地仓库,进入 "conf/settings.xml" 中,在 settings 节下开启如下配置,该路径就是指向本地仓库的路径:

<localRepository>E:\dev\workspace\maven\repository</localRepository>

Maven 在查找 jar 时遵循什么样的顺序呢?

  1. 优先在本地仓库中查找。
  2. 如果本地仓库中找不到,则从私服查找,找到后下载到本地仓库。
  3. 如果私服中找不到,则从中央仓库查找,找到后下载带私服,最后下载到本地仓库。

为方便使用,这里提供了已包含常用 jar 包的本地仓库,点击下载。

三套生命周期

Maven 对项目构建过程分为三套相互独立的生命周期,请注意这里说的是“三套”,而且“相互独立”,这三套生命周期分别是:

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

每一个阶段都有一个对应的命令,且有相应的插件来支持命令的执行。

注:属于同一个命令周期内的命令,当执行后面的命令时,前面的命令会自动执行。

常用命令

  • complie:编译命令,作用是将 'src/main/java' 下的 java 源文件编译为 class 文件并输出到 target 下的 classes 目录下。
    ZHANGZHONGEN+zze@ZHANGZHONGEN MINGW64 /f/idea/0219/helloworld
    $ mvn compile
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------------< com.zze:helloworld >-------------------------
    [INFO] Building helloworld Maven Webapp 1.0-SNAPSHOT
    [INFO] --------------------------------[ war ]---------------------------------
    [INFO]
    [INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ helloworld ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory F:\idea\0219\helloworld\src\main\resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ helloworld ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.763 s
    [INFO] Finished at: 2019-02-21T15:22:51+08:00
    [INFO] ------------------------------------------------------------------------
    例:
  • clean:清除命令,执行 clean 会删除 target 目录及其目录下所有内容。
    ZHANGZHONGEN+zze@ZHANGZHONGEN MINGW64 /f/idea/0219/helloworld
    $ mvn clean
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------------< com.zze:helloworld >-------------------------
    [INFO] Building helloworld Maven Webapp 1.0-SNAPSHOT
    [INFO] --------------------------------[ war ]---------------------------------
    [INFO]
    [INFO] --- maven-clean-plugin:3.1.0:clean (default-clean) @ helloworld ---
    [INFO] Deleting F:\idea\0219\helloworld\target
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  0.359 s
    [INFO] Finished at: 2019-02-21T15:27:50+08:00
    [INFO] ------------------------------------------------------------------------
    例:
  • test:测试命令,会执行 'src/main/java' 下的单元测试类。
    ZHANGZHONGEN+zze@ZHANGZHONGEN MINGW64 /f/idea/0219/helloworld
    $ mvn test
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------------< com.zze:helloworld >-------------------------
    [INFO] Building helloworld Maven Webapp 1.0-SNAPSHOT
    [INFO] --------------------------------[ war ]---------------------------------
    [INFO]
    [INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ helloworld ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory F:\idea\0219\helloworld\src\main\resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ helloworld ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ helloworld ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory F:\idea\0219\helloworld\src\test\resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ helloworld ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 1 source file to F:\idea\0219\helloworld\target\test-classes
    [INFO]
    [INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ helloworld ---
    [INFO]
    [INFO] -------------------------------------------------------
    [INFO]  T E S T S
    [INFO] -------------------------------------------------------
    [INFO] Running com.zze.test1.DemoTest
    2
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.019 s - in com.zze.test1.DemoTest
    [INFO]
    [INFO] Results:
    [INFO]
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
    [INFO]
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  2.414 s
    [INFO] Finished at: 2019-02-21T15:36:20+08:00
    [INFO] ------------------------------------------------------------------------
    例:
  • package:打包命令,执行 package 命令对于 java 工程会打成 jar 包,对于 web 工程会打成 war 包。
    ZHANGZHONGEN+zze@ZHANGZHONGEN MINGW64 /f/idea/0219/helloworld
    $ mvn package
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------------< com.zze:helloworld >-------------------------
    [INFO] Building helloworld Maven Webapp 1.0-SNAPSHOT
    [INFO] --------------------------------[ war ]---------------------------------
    [INFO]
    [INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ helloworld ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory F:\idea\0219\helloworld\src\main\resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ helloworld ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ helloworld ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory F:\idea\0219\helloworld\src\test\resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ helloworld ---
    [INFO] Changes detected - recompiling the module!
    [INFO] Compiling 1 source file to F:\idea\0219\helloworld\target\test-classes
    [INFO]
    [INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ helloworld ---
    [INFO]
    [INFO] -------------------------------------------------------
    [INFO]  T E S T S
    [INFO] -------------------------------------------------------
    [INFO] Running com.zze.test1.DemoTest
    2
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.018 s - in com.zze.test1.DemoTest
    [INFO]
    [INFO] Results:
    [INFO]
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
    [INFO]
    [INFO]
    [INFO] --- maven-war-plugin:3.2.2:war (default-war) @ helloworld ---
    [INFO] Packaging webapp
    [INFO] Assembling webapp [helloworld] in [F:\idea\0219\helloworld\target\helloworld]
    [INFO] Processing war project
    [INFO] Copying webapp resources [F:\idea\0219\helloworld\src\main\webapp]
    [INFO] Webapp assembled in [44 msecs]
    [INFO] Building war: F:\idea\0219\helloworld\target\helloworld.war
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  2.752 s
    [INFO] Finished at: 2019-02-21T15:40:07+08:00
    [INFO] ------------------------------------------------------------------------
    例:
  • install:安装命令,执行 install 会将项目打成 jar 或 war 包发布到本地仓库。
    ZHANGZHONGEN+zze@ZHANGZHONGEN MINGW64 /f/idea/0219/helloworld
    $ mvn install
    [INFO] Scanning for projects...
    [INFO]
    [INFO] -------------------------< com.zze:helloworld >-------------------------
    [INFO] Building helloworld Maven Webapp 1.0-SNAPSHOT
    [INFO] --------------------------------[ war ]---------------------------------
    [INFO]
    [INFO] --- maven-resources-plugin:3.0.2:resources (default-resources) @ helloworld ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory F:\idea\0219\helloworld\src\main\resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.8.0:compile (default-compile) @ helloworld ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-resources-plugin:3.0.2:testResources (default-testResources) @ helloworld ---
    [INFO] Using 'UTF-8' encoding to copy filtered resources.
    [INFO] skip non existing resourceDirectory F:\idea\0219\helloworld\src\test\resources
    [INFO]
    [INFO] --- maven-compiler-plugin:3.8.0:testCompile (default-testCompile) @ helloworld ---
    [INFO] Nothing to compile - all classes are up to date
    [INFO]
    [INFO] --- maven-surefire-plugin:2.22.1:test (default-test) @ helloworld ---
    [INFO]
    [INFO] -------------------------------------------------------
    [INFO]  T E S T S
    [INFO] -------------------------------------------------------
    [INFO] Running com.zze.test1.DemoTest
    2
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.021 s - in com.zze.test1.DemoTest
    [INFO]
    [INFO] Results:
    [INFO]
    [INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
    [INFO]
    [INFO]
    [INFO] --- maven-war-plugin:3.2.2:war (default-war) @ helloworld ---
    [INFO] Packaging webapp
    [INFO] Assembling webapp [helloworld] in [F:\idea\0219\helloworld\target\helloworld]
    [INFO] Processing war project
    [INFO] Copying webapp resources [F:\idea\0219\helloworld\src\main\webapp]
    [INFO] Webapp assembled in [43 msecs]
    [INFO] Building war: F:\idea\0219\helloworld\target\helloworld.war
    [INFO]
    [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ helloworld ---
    [INFO] Installing F:\idea\0219\helloworld\target\helloworld.war to E:\dev\workspace\maven\repository\com\zze\helloworld\1.0-SNAPSHOT\helloworld-1.0-SNAPSHOT.war
    [INFO] Installing F:\idea\0219\helloworld\pom.xml to E:\dev\workspace\maven\repository\com\zze\helloworld\1.0-SNAPSHOT\helloworld-1.0-SNAPSHOT.pom
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  2.544 s
    [INFO] Finished at: 2019-02-21T15:44:21+08:00
    [INFO] ------------------------------------------------------------------------
    例:

依赖管理

依赖的范围

  • compile:编译范围,默认值

    compile 是默认的范围;如果没有提供一个范围,那该依赖的范围就是编译范围。编译范围依赖在所有的 classpath 中可用,同时它们也会被打包。

  • provided:已提供范围

    provided 依赖只有在当 JDK 或者一个容器已提供该依赖之后才使用。例如, 如果你开发了一个 web 应用,你可能在编译 classpath 中需要可用的 Servlet API 来编译一个 Servlet,但是你不会想要在打包好的 war 中包含这个 Servlet API;这个 Servlet API JAR 由你的应用服务器或者 Servlet 容器提供。已提供范围的依赖在编译 classpath (不是运行时)可用。它们不是传递性的,也不会被打包。

  • runtime:运行时范围

    runtime 依赖在运行和测试系统的时候需要,但在编译的时候不需要。比如,你可能在编译的时候只需要 JDBC API JAR,而只有在运行的时候才需要 JDBC 驱动实现。

  • test:测试范围

    test 范围依赖在一般的编译和运行时都不需要,它们只有在测试编译和测试运行阶段可用。

  • system:系统范围

    system 范围依赖与 provided 类似,但是你必须显式的提供一个对于本地系统中JAR 文件的路径。这么做是为了允许基于本地对象编译,而这些对象是系统类库的一部分。这样的构件应该是一直可用的,Maven 也不会在仓库中去寻找它。如果你将一个依赖范围设置成系统范围,你必须同时提供一个 systemPath 元素。注意该范围是不推荐使用的(你应该一直尽量去从公共或定制的 Maven 仓库中引用依赖)。

依赖的传递

参考工程的继承与聚合,它其实就是使用依赖的传递来实现的。

排除依赖

创建工程,引入 'struts2-core' 依赖:

<?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.zze</groupId><artifactId>A</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId><version>2.3.37</version></dependency></dependencies></project>

pom.xml

假如我们不想使用传递进来的 'javassist',那么我们可以通过配置将其排除:

<?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.zze</groupId><artifactId>A</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId><version>2.3.37</version><exclusions><exclusion><groupId>javassist</groupId><artifactId>javassist</artifactId></exclusion></exclusions></dependency></dependencies></project>

pom.xml

路径近者优先

创建工程,引入'struts2-spring-plugin' 依赖:

<?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.zze</groupId><artifactId>A</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-spring-plugin</artifactId><version>2.3.37</version></dependency></dependencies></project>

pom.xml

接着引入 'spring-beans' 的依赖:

<?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.zze</groupId><artifactId>A</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-spring-plugin</artifactId><version>2.3.37</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.2.4.RELEASE</version></dependency></dependencies></project>

pom.xml

此时会发现 'spring-beans' 的版本为下面直接声明的版本,因为它是直接引入,相对传进进来路径更近。

第一声明者优先

创建工程,引入 'struts2-spring-plugin' 依赖:

<?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.zze</groupId><artifactId>A</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-spring-plugin</artifactId><version>2.3.37</version></dependency></dependencies></project>

pom.xml

接着引入 'spring-context' 依赖:

<?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.zze</groupId><artifactId>A</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-spring-plugin</artifactId><version>2.3.37</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.4.RELEASE</version></dependency></dependencies></project>

pom.xml

此时会发现 'spring-beans' 的版本依旧是 'struts2-spring-plugin' 传递进来的,因为 'struts2-spring-plugin' 是先声明的。

交换 'struts2-spring-plugin' 和 'spring-context' 依赖的声明顺序:

<?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.zze</groupId><artifactId>A</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.2.4.RELEASE</version></dependency><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-spring-plugin</artifactId><version>2.3.37</version></dependency></dependencies></project>

pom.xml

此时 'spring-beans' 的版本就改为 'spring-context' 传递进来的版本了,因为 'spring-context' 是先声明的。

版本锁定

版本锁定一般在父子工程间使用,创建父工程 A,锁定 'spring-beans' 的版本:

<?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.zze</groupId><artifactId>A</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>../B</module></modules><dependencyManagement><!--dependencyManagement 下的 dependencies 节只是用来预先锁定指定依赖的版本,并不会真的引入依赖--><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><version>4.2.4.RELEASE</version></dependency></dependencies></dependencyManagement></project>
pom.xml [A]

创建子工程 B ,继承父工程 A,引入 'spring-beans' 依赖:

<?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"><parent><artifactId>A</artifactId><groupId>com.zze</groupId><version>1.0-SNAPSHOT</version><relativePath>../A/pom.xml</relativePath></parent><modelVersion>4.0.0</modelVersion><artifactId>B</artifactId><dependencies><!--因为在父工程中已经锁定了 spring-beans 的版本,所以在子工程中不用指定版本--><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId></dependency></dependencies>
</project>
pom.xml [B]

因为在父工程中已经锁定了 'spring-beans' 的版本,所以在子工程中不指定版本会默认引用父工程锁定的版本。

版本常量使用

创建工程,创建版本常量,在依赖中引用版本常量:

<?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.zze</groupId><artifactId>A</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><properties><!--创建版本常量--><spring.version>4.2.4.RELEASE</spring.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-beans</artifactId><!--引用版本常量--><version>${spring.version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency></dependencies></dependencyManagement></project>
pom.xml

工程的继承与聚合

继承

创建一个父工程 A,再创建一个子工程 B 继承 A:

<?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.zze</groupId><artifactId>A</artifactId><version>1.0-SNAPSHOT</version><packaging>pom</packaging><modules><module>../B</module></modules><dependencies><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId><version>2.3.37</version></dependency></dependencies>
</project>
pom.xml [A]
 <?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"><parent><artifactId>A</artifactId><groupId>com.zze</groupId><version>1.0-SNAPSHOT</version><relativePath>../A/pom.xml</relativePath></parent><modelVersion>4.0.0</modelVersion><packaging>jar</packaging><artifactId>B</artifactId></project>
pom.xml [B]

A 的 依赖会传递给B,此时就可以直接在子工程 B 中使用父工程 A 依赖了,这就是工程的继承。

聚合

创建工程 A,再创建工程 B 依赖工程 A:

<?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.zze</groupId><artifactId>A</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.apache.struts</groupId><artifactId>struts2-core</artifactId><version>2.3.37</version></dependency></dependencies>
</project>
pom.xml [A]
<?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.zze</groupId><artifactId>B</artifactId><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>com.zze</groupId><artifactId>A</artifactId><version>1.0-SNAPSHOT</version></dependency></dependencies>
</project>
pom.xml [B]

此时 A 的依赖会传递给 B ,在工程 B 就可以直接使用工程 A 引入的依赖了,这就是工程的聚合。

IDEA中使用Maven

配置

1、快捷键 CTRL+ALT+S 打开 IDEA 设置,配置 Maven 地址:

2、在 Importing 页中勾选如图项:

3、配置 Runner 页中属性 '-DarchetypeCatalog=internal',防止未联网情况不能创建 Maven 工程。

创建工程

创建java工程

1、新建项目,选中 Maven,直接 Next:

2、输入坐标,再次 Next:

3、直接 Finish:

4、创建完成,编写代码测试:

创建web工程

1、新建项目,选中 Maven,如图选择 web 工程骨架,Next:

2、选择自己配置的 Maven 目录,Next:

3、直接 Finish:

4、输出如图则创建成功:

web项目的运行

准备

下面以运行一个 HelloWorld 程序为例:

1、新建 web 项目,在 'src/main' 下 java 创建文件夹,并标记其为 Sources Root 文件夹,执行完这个操作后 java 文件夹就相当于普通工程的 classpath 根目录了。

2、在 pom 文件中引入 Servlet 开发依赖 jar:

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

注意:因为 maven  web 工程后续运行时使用 maven 提供的 tomcat 环境,这里要设置引入 jar 的 scope 为 provided,否则会因为 jar 包重复出异常。

3、在 'src\main\java' 下创建 Servlet 如下:

package com.zze.servlet;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;public class HelloServlet extends HttpServlet {protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {response.getWriter().write("Hello world!!!");}
}
com.zze.servlet.HelloServlet
<servlet><servlet-name>helloServlet</servlet-name><servlet-class>com.zze.servlet.HelloServlet</servlet-class>
</servlet>
<servlet-mapping><servlet-name>helloServlet</servlet-name><url-pattern>/hello</url-pattern>
</servlet-mapping>
WEB-INF/web.xml

运行方式一:命令运行

1、打开 MavenProjects 窗口:

2、点击如图按钮:

3、输入 'tomcat:run' 指令,Execute:

4、此时项目就以被部署到 tomcat 并运行:

5、访问 'localhost:8080/helloworld/hello' 测试:

运行方式二:配置运行

1、进入 Edit Configurations:

2、选择 Maven:

3、输入如下,Apply:

4、此时就可直接点击该图标启动项目了:

5、还可在 Maven Projects 窗口中双击该配置启动:

运行方式三:本地Tomcat运行

1、进入 Edit Configurations:

2、选择 Tomcat 下的 Local 项:

3、选择 Deployment 栏,点击 + 号:

3、选择 Artifact:

4、选择 war exploded 结尾项:

5、OK,接下来就可以像运行普通 web 工程一样启动 maven 项目:

补充

配置国内仓库源

在 "conf/settings.xml" 文件中的 mirrors 节下选下面一个节点添加即可:

<mirror><id>alimaven</id><name>aliyun maven</name><url>http://maven.aliyun.com/nexus/content/groups/public/</url><mirrorOf>central</mirrorOf>        
</mirror>
阿里云
<mirror><id>jboss-public-repository-group</id><mirrorOf>central</mirrorOf><name>JBoss Public Repository Group</name><url>http://repository.jboss.org/nexus/content/groups/public</url>
</mirror>
jboss

配置Tomcat插件

<!--使用 tomcat7:run-->
<plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>8080</port><path>/</path></configuration>
</plugin>

聚合工程整合SSH示例

点击下载

IDEA创建Maven工程常用骨架

下面是我习惯使用的骨架:

创建普通 java 工程:不使用骨架;

创建父工程:maven-archetype-site-simple;

创建 web 工程:maven-archetype-webapp;

转载于:https://www.cnblogs.com/zze46/p/10399663.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/365579.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python用turtle画彩虹_Python利用turtle库绘制彩虹代码示例

语言&#xff1a;PythonIDE&#xff1a;Python.IDE需求做出彩虹效果颜色空间RGB模型&#xff1a;光的三原色&#xff0c;共同决定色相HSB/HSV模型&#xff1a;H色彩&#xff0c;S深浅&#xff0c;B饱和度&#xff0c;H决定色相需要将HSB模型转换为RGB模型代码示例&#xff1a;#…

MongoDB事实:商品硬件上每秒插入80000次以上

在尝试一些时间序列集合时&#xff0c;我需要一个大数据集来检查我们的聚合查询在增加数据负载的情况下不会成为瓶颈。 我们解决了5000万份文档&#xff0c;因为超出此数目我们仍然会考虑分片。 每次事件如下所示&#xff1a; {"_id" : ObjectId("5298a5a03b3…

day 17python 面对对象之继承

一&#xff1a;什么面向对象的继承&#xff1f; 比较官方的说法就是&#xff1a; 继承&#xff08;英语&#xff1a;inheritance&#xff09;是面向对象软件技术当中的一个概念。如果一个类别A“继承自”另一个类别B&#xff0c;就把这个A称为“B的子类别”&#xff0c;而把B称…

mybatis源码_Mybatis源码之SqlSession

SqlSession简介Mybatis是一个强大的ORM框架&#xff0c;它通过接口式编程为开发者屏蔽了传统JDBC的诸多不便&#xff0c;以简单的方式提供强大的扩展能力。其中的接口式编程就是指日常使用的Mapper接口&#xff0c;Mybatis借助动态代理实现了sql语句与Mapper的接口的动态绑定&a…

r语言kmodes_聚类分析——k-means算法及R语言实现

我们知道『物以类聚&#xff0c;人以群分』&#xff0c;这里并不是分类问题&#xff0c;而是聚类问题。两者主要区别在于&#xff0c;分类是将一组数据根据不同的类区分&#xff0c;已经知道有哪些类&#xff0c;也就是数据已经有了类的标签。而聚类是一种事先不知道有多少类&a…

VSCode安装jshint插件报错

Mac电脑上使用VSCode安装jshint插件时提示如下错误&#xff1a; Failed to load jshint library. Please install jshint in your workspace folder using npm install jshint or globally using npm install -g jshint and then press Retry. 按照提示&#xff0c;使用np…

集合框架总结

2019作为新的一年开始&#xff0c;我也着手面试的准备。这篇的博客的主角集合--面试中都会出现的&#xff0c;所以今天特作此总结&#xff0c;也算是复习的成果的一个展示。在查看了许多的博客和源码后我决定将其分成3部分来总结。 三个部分分别是&#xff1a;集合的分类、各个…

调查内存泄漏第2部分–分析问题

这个小型系列的第一个博客介绍了如何创建一个非常泄漏的示例应用程序&#xff0c;以便我们可以研究解决服务器应用程序上基于堆的问题的技术。 它展示了Producer-Consumer模式的一个大问题&#xff0c;即消费者代码必须能够至少与生产者一样快&#xff08;如果不是更快&#xf…

调查内存泄漏第1部分–编写泄漏代码

前几天&#xff0c;我发现了这个小问题&#xff1a;该服务器运行了一段时间&#xff0c;然后掉下来了。 然后通过启动脚本重新启动&#xff0c;整个过程重复进行。 这听起来并不那么糟糕&#xff0c;尽管对数据的损失很大&#xff0c;但对业务的重要性并不重要&#xff0c;因此…

[NOIP2013]火柴排队

嘟嘟嘟 首先可以想到&#xff0c;最小距离一定是a中第 i 大的和b中第 i 大的在同一行。 然后先把a&#xff0c;b分别离散化&#xff0c;然后开一个标记数组&#xff0c;map[i]记录a中第 i 小的数在哪一个位置出现&#xff0c;然后对b数组处理一遍。 题中说交换次数&#xff0c;…

2018秋季C语言学习总结

转载于:https://www.cnblogs.com/noacgnnolife/p/10413255.html

解决Charles手机安装SSL证书后,获取到的接口为unknown,且乱码问题

按照正常流程将Charles安装并设置代理后&#xff0c;手机添加完代理并安装SSL证书&#xff0c;尝试抓取接口时&#xff0c;获取到的接口为unknown且返回内容乱码&#xff0c;如下图所示 解决办法&#xff1a; 在Proxy-SSL Proxying Settings-SSL Proxying下添加想要抓取的服务地…

Sum of Even Numbers After Queries

Solution: 转载于:https://www.cnblogs.com/Julietma/p/10414394.html

Python学习week7-文件操作

1、文件IO常用操作 # 文件操作命令 2、打开操作open # open(file, moder, buffering-1, encodingNone, errorsNone, newlineNone, closefdTrue, openerNone) 创建并打开一个文件test&#xff0c;然后关闭&#xff1b;打开一个文件&#xff0c;返回一个文件对象&#xff08;流对…

风险定量分析工具 龙卷风图 决策树形图 蒙特卡洛模拟

龙卷风图&#xff1a;是项目管理中用于在风险识别和定性分析之后&#xff0c;进行定量风险分析的技术----敏感性分析技术中最常用的一种图表技术。 敏感性分析&#xff1a;敏感性分析有助于确定哪些风险对项目具有最大的潜在影响。它把所有其他不确定因素保持在基准值的条件下…

推土机:将JAXB对象映射到业务/域对象

Dozer是开放源代码&#xff08; Apache 2许可 &#xff09;“ Java Bean到Java Bean映射器&#xff0c;可将数据从一个对象递归复制到另一个对象”。 正如从其主页上的描述所描述的那样&#xff0c;它用于映射两个JavaBeans实例&#xff0c;以在实例之间进行自动数据复制。 尽管…

openssl不是内部或外部命令_OpenSSL新架构蓝图

概述日前OpenSSL官网公布了未来OpenSSL的架构蓝图。作为战略性的架构目标&#xff0c;需要大量的版本迭代本文档概述了OpenSSL战略架构。它需要多个版本的迭代从目前最新的版本1.1开始直到3.0甚至是4.0最终实现。由于版本架构变动非常大&#xff0c;涉及大量的变化和迭代&#…

休眠事实:始终检查Criteria API SQL查询

Criteria API对于动态构建查询非常有用&#xff0c;但这是我使用它的唯一用例。 每当您有一个带有N个过滤器且可以以任意M个组合到达的UI时&#xff0c;都有一个API动态构造查询是有意义的&#xff0c;因为串联字符串始终是我所不愿使用的路径。 问题是&#xff0c;您是否知道…

treegrid,可以展开的jqgrid树

效果图 html部分 <div class"padding20 bgWhite marginTop20"> <div class"cus-grid row" id"grid-wrap"> <div class"col-lg-12"> <table id"list2"></table> …

winfrom软件开发汽车测试_ETci — 全自动软件测试调度(持续集成)平台

ETci 提供了编译- 测试- 发布解决方案&#xff0c;包括&#xff1a;自动提取配置库代码进行自动构建, 自动调度静态测试工具(如QAC)进行静态测试&#xff0c;自动调度单元测试工具(如Tessy)开展动态测试&#xff0c;自动调度HIL 自动化测试系统等。使得开发、测试团队在软件开发…