java学习之maven
maven是项目构建工具,能把项目抽象成POM(Project Object Model)
Maven使用POM对项目进行构建、打包、文档化等操作
解决了项目需要类库的依赖管理,简化了项目开发环境搭建的过程
maven实现了:
是构建项目变得容易;
统一了构建项目的方式,通过pom.xml描述项目;
提出了一套开发项目的最佳实践,源代码在src/main/java中,配置文件在src/main/resources中,测试代码在src/test/java中;
包含不同环境项目构建方式;
解决了类库依赖的问题,自动下载依赖包,协助管理jar包之间的冲突
1.maven的核心是pom.xml,用XML方式描述了项目模型
<?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.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>demo</name> <description>Demo project for Spring Boot</description> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.0.0.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
groupId项目所属的组
artifactId 项目唯一标识
version项目的版本号
packaging项目的类型,常用的有jar和war
modelVersion maven的版本
dependencies依赖
build插件
2.下载
https://maven.apache.org/
3.安装
直接解压,如E:\baby\software\java\apache-maven-3.5.3
设置环境变量
MAVEN_HOME = E:\baby\software\java\apache-maven-3.5.3 path = %MAVEN_HOME%\bin;
安装Maven是否安装成功
mvn -version
4.设置maven
中心仓库位于国外,下载速度会很慢
安装目录下,conf/settings.xml
添加仓库镜像
<mirror> <id>alimaven</id> <mirrorOf>central</mirrorOf> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/groups/public/</url> </mirror>
5.常用的命令
新建一个maven目录
(1)进入此目录,创建一个maven工程
mvn -B archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes -DgroupId=com.mycompany.app -DartifactId=my-app
成功创建项目工程my-app
目录结构
maven项目采用“约定优于配置”的原则
src/main/java约定用于存放源代码
src/main/test用于存放单元测试代码
src/target用于存放编译、打包后的输出文件
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.mycompant.app</groupId> <artifactId>my-app</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>my-app</name> <url>http://maven.apache.org</url> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> </project>
(2)编译maven工程
mvn compile
会自动在target目录中生成class文件
打包编译时后台一直输出警告信息
在pom.xml增加
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
(3)删除target目录
mvn clean
(4)测试
mvn clean test
/src/test/java/com/mycompant/app/AppTest.java里的junit的测试用例,把testApp()方法中的assertTrue( true );改成assertTrue( false );
mvn clean test
(5)运行
A.不需要传递参数的
mvn exec:java -Dexec.mainClass="com.mycompant.app.App"
B.需要传递参数的
mvn exec:java -Dexec.mainClass="com.mycompant.app.App" -Dexec.args="arg0 arg1 arg2"
C.修改pom.xml
在</project>前增加下面代码
<build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <goals> <goal>exec</goal> </goals> </execution> </executions> <configuration> <executable>java</executable> <arguments> <argument>-classpath</argument> <classpath> </classpath> <argument>com.mycompant.app.App</argument> </arguments> </configuration> </plugin> </plugins> </build>
直接
mvn exec:exec
(6)打包
mvn package
在target目录生成jar或war
直接到target
目录下去执行java -jar my-app.jar
命令运行jar包时出现了“my-app.jar没有主清单属性”的错误提示
加上入口类的配置,在pom.xml中的</plugins>前加入如下代码
<plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.mycompant.app.App</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin>
说明:
配置完成后,执行mvn package即可打包
在target目录下会生成两个jar包,注意不是my-app.jar文件,而是另外一个
(my-app.jar 是因为<build>中包含 <finalName>${project.artifactId}</finalName>,否则名为original-xxx.jar)
生成的jar文件包含了所有依赖,所以可以直接运行
重新打包
mvn clean package
重新进入target
此时会有两个jar文件
java -jar my-app-1.0-SNAPSHOT.jar
如果项目中用到了Spring Framework,将依赖打到一个jar包中,运行时会出现读取XML schema文件出错。原因是Spring Framework的多个jar包中包含相同的文件spring.handlers和spring.schemas,如果生成一个jar包会互相覆盖。为了避免互相影响,可以使用AppendingTransformer来对文件内容追加合并:
完整的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.mycompant.app</groupId> <artifactId>my-app</artifactId> <packaging>jar</packaging> <version>1.0-SNAPSHOT</version> <name>my-app</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.codehaus.mojo</groupId> <artifactId>exec-maven-plugin</artifactId> <version>1.2.1</version> <executions> <execution> <goals> <goal>exec</goal> </goals> </execution> </executions> <configuration> <executable>java</executable> <arguments> <argument>-classpath</argument> <classpath> </classpath> <argument>com.mycompant.app.App</argument> </arguments> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>2.4.1</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>com.mycompant.app.App</mainClass> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.handlers</resource> </transformer> <transformer implementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"> <resource>META-INF/spring.schemas</resource> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
直接到target运行
java -jar my-app.jar
输出Hello World!
6.使用IDE设置Maven
Eclipse windows--》preference
add,Installation home 输入maven的安装目录
添加后勾选使用新的maven
创建web的maven项目 File -> New -> Maven Project -> Next
Group id和Artifact id
finish
说明:
项目可能会出现 The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path 的错误
点击项目右键>>Build Path>>Configure Build Path>>Libraries>>Add Library>>Server Runtime>>配置好的tomcat服务>>finish>>apply and Close
tomcat server start
浏览器中 http://localhost:8080/my-app/
输出