使用idea创建maven工程首先本地要安装的有maven环境。
接下来idea集成maven配置如下:
配置参数:
-DarchetypeCatalog=internal
作用:如果我们使用maven为我们提供好的骨架来创建maven工程的话,它一般是需要联网的,但是为了在不连网的情况下,我们可以正常创建工程,只有配置了这个参数,我们之前连网下载过的相关工程的插件,它就会从本地找到对应的插件,就不用在从网络上下载了
如下是maven工程为我们提供好的可以直接使用的maven工程骨架/模板,如果要使用这些骨架,前提是必须联网
使用maven通过的骨架创建java工程步骤:
❤❤❤❤❤❤❤截图版❤❤❤❤❤❤❤❤❤❤
初次创建maven工程需要从网上下载插件,需要花点时间。可以看出maven创建的java工程的目录,并没有创建配置文件要放置的目录,这个目录我们需要自己创建
我们在main文件下创建resources文件夹,与java目录都在main文件夹下,创建之后我们还要将resources目录改为资源配置目录,操作如下:
不使用骨架创建maven工程,这样的好处就是创建的maven工程自动为我们创建资源目录resources:
使用idea创建web工程:
需要在main目录下手动创建java或resources目录,并将java目录和resources设置为资源目录
Maven项目结构
常用的maven命令:
compile是maven工程的编译命令,作用是将src/main/java下的文件编译为class文件输出 到target目录下。
test是maven工程的测试命令,会执行src/test/java下的单元测试类。
clean是maven工程的清理命令,执行clean会删除target目录的内容。
package是maven工程的打包命令,对于java工程执行package打成jar包,对于web工程 打成war包。
install是maven工程的安装命令,执行install将maven打成jar包或war包发布到本地仓库。
maven中的坐标问题:
每个maven工程都需要定义本工程的坐标,坐标是maven对jar包的身份定义,比如:
<!--公司或组织域名的倒序,类似包名-->
<groupld>com.itmeng</groupld>
<!-项目名或模块名-->
<artifactld>maven-first</artifactld>
<!-当前项目版本号,snapshot为快照版本即非正式版本,release为正式发布版本->
<version>0.0.1-SNAPSHOT</version>
<packaging > :打包类型
jar:执行package会打成jar包
war:执行package会打成war包
pom :用于maven工程的继承,通常父工程设置为pom
什么是依赖传递
先添加springmvc的核心依赖的坐标
会发现出现除了spring-webmvc以外的其他jar。因为我们的项目依赖spring-webmv.jar,而spring-webmv.jar会依赖spring-beans.jar等等,所以spring-beans.jar这些jar包也出现在了我们的maven工程中,这种现象我们称为依赖传递。从下图中可看到他们的关系:(请注意spring-beans的版本)
接着添加一个依赖
我们会发现这两个jar包同时都依赖了spring-beans
但是spring-webmvc依赖spirng-beans-4.2.4,spring-context依赖spring-beans-5.0.2,但是发现spirng-beans-4.2.4加入到工程中
而我们希望spring-beans-5.0.2加入工程。这就造成了依赖冲突。解决依赖冲突有以下原则:
依赖调解原则
maven自动按照下边的原则调解
1、第一声明者优先原则
在pom文件定义依赖,先声明的依赖为准。
测试:如果将上边spring-webmvc和spring-context顺序颠倒,系统将导入spring-beans-5.0.2。
分析:由于spring-webmvc在前边以spring-webmvc依赖的spring-beans-5.0.2为准,所以最终spring-beans-5.0.2添加到了工程中。
2、路径近者优先原则
例如:还是上述情况,spring-contex和spring-webmvc都会传递过来spirng-beans,那如果直接把spring-beans的依赖直接写到pom文件中,那么项目就不会再使用其他依赖传递来的spring-beans,因为自己直接在pom中定义spring-beans要比其他依赖传递过来的路径要近。
在本工程中的pom中加入spirng-beans-5.0.2的依赖,根据路径近者优先原则,系统将导入spirng-beans-5.0.2:
排除依赖
上边的问题也可以通过排除依赖方法辅助依赖调解,如下:比如在依赖spring-webmvc的设置中添加排除依赖,排除spring-beans,下边的配置表示:依赖spring-webmvc,但排除spring-webmvc所依赖的spring-beans。
锁定版本
面对众多的依赖,有一种方法不用考虑依赖路径、声明优化等因素可以采用直接锁定版本的方法确定依赖构件的版本,版本锁定后则不考虑依赖的声明顺序或依赖的路径,以锁定的版本的为准添加到工程中,此方法在企业开发中常用。
如下的配置是锁定了spring-beans和spring-context的版本:
还可以把版本号提取出来,使用标签设置成变量。
注意:在工程中锁定依赖的版本并不代表在工程中添加了依赖,如果工程需要添加锁定版本的依赖则需要单独添加标签,如下:
上边添加的依赖并没有指定版本,原因是已在中锁定了版本,所以在下不需要再指定版本。
分模块构建maven工程
分模块构建maven工程分析
在现实生活中,汽车厂家进行汽车生产时,由于整个生产过程非常复杂和繁琐,工作量非常大,所以车场都会将整个汽车的部件分开生产,最终再将生产好的部件进行组装,形成一台完整的汽车。
maven工程的继承
在Java语言中,类之间是可以继承的,通过继承,子类就可以引用父类中非private的属性和方法。同样,在maven工程之间也可以继承,子工程继承父工程后,就可以使用在父工程中引入的依赖。继承的目的是为了消除重复代码。
maven工程的聚合
在maven工程的pom.xml文件中可以使用标签将其他maven工程聚合到一起,聚合的目的是为了进行统一操作。例如拆分后的maven工程有多个,如果要进行打包,就需要针对每个工程分别执行打包命令,操作起来非常繁琐。这时就可以使用标签将这些工程统一聚合到maven工程中,需要打包的时候,只需要在此父工程中执行一次打包命令,其下被聚合的工程就都会被打包了。
项目整体结构如下:
1)maven_parent为父工程,其余工程为子工程,都继承父工程maven_parent
2)maven_parent工程将其子工程都进行了聚合
3)子工程之间存在依赖关系,比如maven_dao依赖, maven_pojo、maven_service依赖maven_dao、maven_web依赖maven_service
聚合项目演示:
一般项目当中有dao,service层,现在我们有后台项目模块,该后台项目模块存在web,controller层,后台项目模块中的controller层会去调用service层,service层会去调用dao层。以前我们会把 service和dao都放在后台项目模块当中,也就是同一个包下,为了日后的扩展, 现在我们将service和dao层都抽取独立出来,再整合到后台项目模块当中
创建聚合项目(以淘宝卖家后台taobao-merchant和买家后台taobao-buyer为例)
首先创建一个maven工程,打包方式为pom,删除src目录,因为打包方式为pom的项目,只是为了聚合子模块,在src目录不写任何的代码
在pom.xml配置指定版本的编译器:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build>
创建taobao-model子模块,打包方式为jar,当然创建的maven项目默认打包为jar
创建User实体类
public class User {
private String username;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
@Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
'}';
}
}
创建taobao-dao子模块,打包方式为jar,当然创建的maven项目默认打包为jar
创建UserDao接口和实现类,写两个方法,发现需要引入User实体,我们已经在taobao-model子模块当中写过了,我们只需要在pom文件当中引入taobao-model依赖坐标即可
UserDao接口
public interface UserDao {
public void save(User user);
public User findById(Integer id);
}
UserDaoImpl 接口实现类:
public class UserDaoImpl implements UserDao {
@Override
public void save(User user) {
System.out.println("保存user");
}
@Override
public User findById(Integer id) {
System.out.println("根据od查找user");
return null;
}
}
发现taobao-dao模块报错,是因为在该模块当中并没有User实体 ,在pom文件当中引入taobao-model子模块。
<dependency>
<groupId>com.taobao</groupId>
<artifactId>taobao-model</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
查看dao 的maven信息
创建taobao-service子模块,打包方式为jar,当然创建的maven项目默认打包为jar
创建接口和实现类
接口:
public interface UserService {
public void save(User user);
public User findById(Integer id);
}
实现类:
public class UserServiceImpl implements UserService {
UserDao userDao = new UserDaoImpl();
@Override
public void save(User user) {
userDao.save(user);
}
@Override
public User findById(Integer id) {
return userDao.findById(id);
}
}
在service子模块当中我们要调用dao子模块,同时也要依赖User实体的子模块model,我们在pom文件当中引入这一个dao依赖坐标即可,因为dao依赖了model,通过依赖传递即可:
pom:
<dependency>
<groupId>com.taobao</groupId>
<artifactId>taobao-dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
查看service的maven配置:
接下来我们创建taobao-merchant商家后台模块,后台模块要创建web项目,打包方式为war
在后台模块我们创建controller层。具体的代码就不写,同样该模块需要引入service子模块,通过依赖传递又会引入dao和model子模块
pom:
<dependency>
<groupId>com.taobao</groupId>
<artifactId>taobao-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
查看controller的maven配置:
以同样的方式创建买家后台taobao-buyer,打包方式也为war,同卖家后台一样
整体聚合项目结构如图:
接下来咱们就可以整体的将项目进行打包,执行操作:
控制台信息:
打包成功,可以查看每一个子模块目录下有target目录生成,jar和war都放在其中:
也可以查看本地仓库:
查看taobao-merchant商家后台子模块war包:
发现taobao-merchant商家后台子模块所依赖的jar全部都被打包在war包当中
这样的话,我们启动taobao-merchant商家后台模块就可以将项目运行起来,前提是要将整个项目打包安装。那又如何将taobao-merchant商家后台运行起来?
我们在taobao-merchant的pom文件当中配置tomcat插件
<build>
<plugins>
<plugin>
<!-- 配置插件tomcat7 -->
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<port>8080</port>
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
接下来启动项目:
查看控制台:
接下来我们访问该后台项目:
也就是,只需要把taobao-merchant商家后台子模块 install下,在他的targit目录下,把.war包丢进服务器即可
以上就是maven创建的聚会工程以及模块间的依赖传递和启动聚会项目。