创建Maven工程

Posted YJ

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了创建Maven工程相关的知识,希望对你有一定的参考价值。

Eclipse中配置Maven

1.指定Maven核心程序的位

WindowPreferencesMavenInstallations  --(Installation home:D:\\apache-maven-3.2.2)

2.指定settings.xml

Window→Preferences→Maven→User Settings --(Global Setting:D:\\apache-maven-3.2.2\\conf\\settings.xml)

自动查找settings.xml中Local Repository:(D:\\RepMaven)


 修改工程默认的JDK版本:

D:\\apache-maven-3.2.2\\conf\\settings.xml下

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


 创建Maven项目

new→New Maven project(勾选Create a simple project,然后next)

→Artifact下(Group Id:com.atguigu.maven ; Artifact Id:MakeFriend,然后finish)


 导入 Maven工程:

如果第一次导入手动创建的Maven工程:

Import→Maven→Existing Maven Project(next)→Root Directory:直接选择工作空间(会自动扫描,勾选后,Finish)

导入后HelloFriend工程,目录:D:\\SpringToolSuite\\HelloFriend下

会多出:

.settings

.classpath

.project

如果导入通过Eclipse创建的Maven工程:

可以Import→General→Existing Projects into Workspace


 运行Maven工程

工程右键Run As,可选build:

1.Maven build

2.Maven build...

3.Maven clean --清理

4.Maven generate-sources

5.Maven install --安装

6.Maven test --测试

如果没有想要的命令:可以选择2.Maven build...,Main中(Goals:compile)点击Run


 解决项目测试乱码问题:

在当前项目的pom.xml文件中增加插件配置

<build>
  <plugins>
    <!-- 解决maven test命令时console出现中文乱码乱码 -->
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>2.7.2</version>
      <configuration>
        <forkMode>once</forkMode><!--在一个进程中进行所有测试 ; 默认值:once -->
        <argLine>-Dfile.encoding=UTF-8</argLine>
      </configuration>
    </plugin>
  </plugins>
</build>


 Maven项目依赖的范围

1) compile

[1]main目录下的Java代码可以访问这个范围依赖

[2]test目录下的Java代码可以访问这个范围依赖

[3]部署Tomcat服务器上运行时放在WEB-INFlib目录下

例如对Hello的依赖。主程序、测试程序服务器运行时都需要用到

2) test

[1]main目录下的Java代码不能访问这个范围依赖

[2]test目录下的Java代码可以访问这个范围依赖

[3]部署Tomcat服务器上运行时不会放在WEB-INFlib目录下

例如:对junit依赖。仅仅是测试程序部分需要。

3) provided

[1]main目录下的Java代码可以访问这个范围依赖

[2]test目录下的Java代码可以访问这个范围依赖

[3]部署Tomcat服务器上运行时不会放在WEB-INFlib目录下

例如servlet-api服务器上运行时,Servlet容器会提供相关API,所以部署的时候不需要

4)runtime

[1]main目录下的Java代码不能访问这个范围的依赖

[2]test目录下的Java代码可以访问这个范围的依赖

[3]部署到Tomcat服务器上运行时放在WEB-INF的lib目录下

其他importsystem等。


 Maven项目依赖的传递性

存在间接依赖的情况时,主工程间接依赖jar可以访问吗?要看间接依赖的jar包引入时的依赖范围——只有依赖范围为compile时可以访问


 Maven项目依赖的原则:解决jar包冲突

1) 路径最短者优先

 

2) 路径相同时先声明者优先

 

这里“声明先后顺序指的是dependency标签配置的先后顺序。


 Maven依赖的排除

1) 有的时候为了确保程序正确可以将有可能重复的间接依赖排除。请看如下的例子:

假设当前工程为public直接依赖environmentenvironment依赖commons-logging1.1.1对于public来说间接依赖。

当前工程public直接依赖commons-logging1.1.2

加入exclusions配置后可以在依赖environment时候排除版本1.1.1commons-logging的间依赖

在public项目的pom.xml文件中增加插件配置

<dependency>

  <groupId>com.atguigu.maven</groupId>

  <artifactId>Environment</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <!-- 依赖排除 -->

  <exclusions>

    <exclusion>

      <groupId>commons-logging</groupId>

      <artifactId>commons-logging</artifactId>

    </exclusion>

  </exclusions>

</dependency>

<dependency>

  <groupId>commons-logging</groupId>

  <artifactId>commons-logging</artifactId>

  <version>1.1.2</version>

</dependency>

 public在依赖Environment时排除他的依赖的commons-logging1.1.1版本,public再依赖commons-logging1.1.2版本


 Maven统一管理目标jar包的版本

问题是如果我们想要这些jar包的版本统一升级为4.1.1统一配置的方式

<properties>

  <spring.version>4.1.1.RELEASE</spring.version>

</properties>

        <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${spring.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${spring.version}</version>
		</dependency>

 Maven项目更新:

Maven→Update Project


 Maven继承

为什么需要继承机制?

由于非compile范围的依赖信息不能在“依赖中传递的,所以有需要的工程只能单独配置。例如

Hello

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.0</version>

<scope>test</scope>

</dependency>

HelloFriend

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.0</version>

<scope>test</scope>

</dependency>

MakeFriend

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.0</version>

<scope>test</scope>

</dependency>

此时如果项目需要将各个模块的junit版本统一为4.9那么各个工程中手动修改无疑是非常不可取的。使用继承机制就可以将这样的依赖信息统一提取到工程模块中进行统一管理。


 创建父工程

创建父工程和创建一般的Maven工程操作一致,唯一需要注意的是:打包方式处要设置为pom

父工程中管理依赖

Parent项目中的dependencies标签,用dependencyManagement标签括起来

<!-- 通过继承管理依赖 -->
  <dependencyManagement>
      <dependencies>
          <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.9</version>
            <scope>test</scope>
        </dependency>
      </dependencies>
  </dependencyManagement>

 子工程中引用父工程

<parent>

  <!-- 父工程坐标 -->

  <groupId>...</groupId>

  <artifactId>...</artifactId>

  <version>...</version>

  <relativePath>从当前目录到父项目的pom.xml文件的相对路径</relativePath>

</parent>

<!-- 配置父工程 -->
    <parent>
        <groupId>com.atguigu.maven</groupId>
        <artifactId>Parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <!-- 从当前工程出发查询父工程中的pom.xml文件的相对路径 -->
        <relativePath>../Parent/pom.xml</relativePath>
    </parent>

 此时如果子工程的groupId和version如果和父工程重复则可以删除。

<!--     <groupId>com.atguigu.maven</groupId> -->
    <artifactId>MakeFriend</artifactId>
<!--     <version>0.0.1-SNAPSHOT</version> -->

在子项目中重新指定需要的依赖,删除范围和版本号

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

 Maven项目聚合:

为什么要使用聚合?

多个工程拆分为模块后,需要手动逐个安装到仓库后依赖才能够生效。修改源码后需要逐个手动进行clean操作。使用了聚合之后就可以批量进行Maven工程的安装、清理工作。

 如何配置聚合?

总的聚合工程Parent使用modules/module标签组合,指定模块工程的相对路径即可

<!-- 聚合 -->
  <modules>
      <module>../MakeFriend</module>
      <module>../OurFriend</module>
      <module>../HelloFriend</module>
      <module>../Hello</module>
  </modules>

 结果:

[INFO] Parent ............................................. SUCCESS [ 0.254 s]  --因为是所有子工程的父工程,所以先
[INFO] Hello .............................................. SUCCESS [ 1.268 s]  --因为HelloFriend 和MakeFriend 依赖Hello ,所以先
[INFO] HelloFriend ........................................ SUCCESS [ 0.674 s]  --因为MakeFriend 依赖HelloFriend ,所以先
[INFO] OurFriend .......................................... SUCCESS [ 0.035 s]  --因为MakeFriend 依赖OurFriend,所以先
[INFO] MakeFriend ......................................... SUCCESS [ 0.075 s]  --因为没有被依赖所以最后,如果都没有相互依赖,按pox.xml中的顺序


 

Maven项目的Web工程

创建Maven的Web工程和创建一般的Maven工程操作一致,唯一需要注意的是:打包方式处要设置为war

但项目中的pom.xml会报错,

解决办法:项目右键属性→Project Facets,把Dynamic Web Module勾去掉,告诉Eclipse不是一个Web工程,点击Apply应用

然后再把Dynamic Web Module勾选上,下方出现Further configuration available,点击应用并关闭

以上是关于创建Maven工程的主要内容,如果未能解决你的问题,请参考以下文章

Maven工程配置代码覆盖工具Jacoco

SpringCloud微服务实战——搭建企业级开发框架:创建Maven工程

7Maven插件

Maven命令

IntelliJ IDEA创建和删除工程

IntelliJ IDEA创建和删除工程