1、首先,确保eclipse中已经配置了maven,如下图:

maven 父子项目打包 maven父子工程打包顺序_jar

maven 父子项目打包 maven父子工程打包顺序_maven 父子项目打包_02

2、New-Project-MavenProject...如下图,选择create a simple project,原因父项目需要建立的packaging为POM,子项目建立的packaging为jar或者war,勾选此处,在下一步中可以选择packaging:

maven 父子项目打包 maven父子工程打包顺序_jar_03

3、选择打包方式

maven 父子项目打包 maven父子工程打包顺序_maven_04

4、创建子工程,New-Project-Maven Module,再次提醒,父项目的packaging选择POM,子项目选择Jar或者war,顺便说一句,一般来说,要创建在tomcat里运行的项目,应该是要创建war,比如本文说的service子项目和web子项目,应该是创建成war,但是有例外是,如果要创建spring boot微服务项目,因为spring boot采用的都是富jar形式,就需要所有的子项目都为jar,这仅仅是个人理解,具体按照自己的需求建立。

maven 父子项目打包 maven父子工程打包顺序_maven_05

5、选择子工程的打包方式,这里设置为jar

maven 父子项目打包 maven父子工程打包顺序_jar_06

6、写到此时,已经创建完成了,我们可以看一下项目架构

maven 父子项目打包 maven父子工程打包顺序_maven 父子项目打包_07

maven 父子项目打包 maven父子工程打包顺序_Maven_08

7、我们把整个项目(父项目)上打包,编译运行,再看一下项目架构:

maven 父子项目打包 maven父子工程打包顺序_maven_09

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