1、首先,确保eclipse中已经配置了maven,如下图:
2、New-Project-MavenProject...如下图,选择create a simple project,原因父项目需要建立的packaging为POM,子项目建立的packaging为jar或者war,勾选此处,在下一步中可以选择packaging:
3、选择打包方式
4、创建子工程,New-Project-Maven Module,再次提醒,父项目的packaging选择POM,子项目选择Jar或者war,顺便说一句,一般来说,要创建在tomcat里运行的项目,应该是要创建war,比如本文说的service子项目和web子项目,应该是创建成war,但是有例外是,如果要创建spring boot微服务项目,因为spring boot采用的都是富jar形式,就需要所有的子项目都为jar,这仅仅是个人理解,具体按照自己的需求建立。
5、选择子工程的打包方式,这里设置为jar
6、写到此时,已经创建完成了,我们可以看一下项目架构
7、我们把整个项目(父项目)上打包,编译运行,再看一下项目架构:
8、我们可以在DemoParent-Son2中引用项目DemoParent-Son1,直接在pom文件中加入依赖即可。
<dependencies>
<dependency>
<groupId>com.nancy</groupId>
<artifactId>DemoParent-Son1</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
</dependency>
</dependencies>
这样,在子项目DemoParent-Son2中就能直接调用子项目DemoParent-Son1中的类。
注意:子工程之间的引用:子工程若是web项目(对应的自动达成的就是war包),可以引用子工程是java项目的工程。但是子工程是java项目却不能引用子工程是web项目的工程。
9、写到此时,项目已经告一段落了,但是小编基于需求,又尝试了一下maven的子项目war与war之间的引用。发现也是可以的。我们再新建一个web子工程DemoParent-Son3,在pom文件中引入子项目DemoParent-Son2,配置文件如下:
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.nancy</groupId>
<artifactId>DemoParent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>DemoParent-Son3</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<dependency>
<groupId>com.nancy</groupId>
<artifactId>DemoParent-Son2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>war</type>
</dependency>
</dependencies>
<build>
<finalName>DemoParent-Son3</finalName>
<!-- 配置中有点说明下:把jar包自动拷贝到web-inf目录地下,这个搞web开发都懂是为什么了 -->
<plugins>
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<executions>
<execution>
<id>copy-lib-src-webapps</id>
<phase>package</phase>
<configuration>
<tasks>
<delete dir="WebContent/WEB-INF/lib" />
<copy todir="WebContent/WEB-INF/lib">
<fileset dir="target/${artifactId}/WEB-INF/lib">
<include name="*" />
</fileset>
</copy>
</tasks>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
两个项目编译、打包之后,生成的WAR文件(DemoParent-Son3.war和DemoParent-Son2.war)几乎是相同的,尽管DemoParent-Son3项目还没有任何类和资源。重要的是,两个WAR归档文件中都有全部的依赖库和配置。
根据Java规范,classpath不能指定WAR文件。这就意味着在编译时,DemoParent-Son3项目无法访问DemoParent-Son2项目中定义的类,所以在DemoParent-Son3l项目中,我们不能像常规类组件那样扩展或使用DemoParent-Son2定义的类。要解决这一问题,我们必须重新设置maven-war-plugin的一项缺省配置,该设置如下面所示:
<build>
<plugins>
<plugin>
<artifactId>maven-war-plugin</artifactId>
<configuration>
<attachClasses>true</attachClasses>
</configuration>
</plugin>
<plugins>
<build>
启用attachClasses选项可以把JAR文件(DemoParent-Son2.jar)和标准的WAR文件同时安装到Maven仓库中。要访问该JAR文件,我们需要像如下所示的那样修改DemoParent-Son3项目的依赖列表。
<dependencies>
<dependency>
<groupId>com.nancy</groupId>
<artifactId>DemoParent-Son2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
<classifier>classes</classifier>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.nancy</groupId>
<artifactId>DemoParent-Son2</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>war</type>
</dependency>
</dependencies>
可以看到,DemoParent-Son3项目用DemoParent-Son2 WAR创建最终的Web归档文件,出于编译需要,还使用了DemoParent-Son2的类(打包在JAR里)。我们将属性classifier设置为classes,以此定义该从仓库中选择哪个工件。将scope设置为provided,则是告诉Maven只在编译时需要该工件,运行时则从其他地方获得。“其他地方”当然就是指DemoParent-Son3项目的WAR工件,WAR插件会将WAR和JAR合并在一起。现在已经正确配置了依赖关系,那我们就开始测试一下。
在DemoParent-Son3中创建一个测试类Test,在测试类中调用一下DemoParent-Son2中的类Student,如下:
public class Test {
public static void main(String[] args) {
Student s = new Student();
s.setName("aaaa");
System.out.println(s.getName()+"1111111");
}
}
运行一下,发现输出栏有我们要的值。
源代码链接https://pan.baidu.com/s/13baE0YjgbEGbM263MRWb5g
提取码4y45