分享

使用eclipse创建maven的父子工程

 liang1234_ 2019-03-28

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文件中加入依赖即可。

  1. <dependencies>
  2. <dependency>
  3. <groupId>com.nancy</groupId>
  4. <artifactId>DemoParent-Son1</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <type>jar</type>
  7. </dependency>
  8. </dependencies>

这样,在子项目DemoParent-Son2中就能直接调用子项目DemoParent-Son1中的类。

注意:子工程之间的引用:子工程若是web项目(对应的自动达成的就是war包),可以引用子工程是java项目的工程。但是子工程是java项目却不能引用子工程是web项目的工程。

9、写到此时,项目已经告一段落了,但是小编基于需求,又尝试了一下maven的子项目war与war之间的引用。发现也是可以的。我们再新建一个web子工程DemoParent-Son3,在pom文件中引入子项目DemoParent-Son2,配置文件如下:

  1. <?xml version='1.0'?>
  2. <project xsi:schemaLocation='http://maven./POM/4.0.0 http://maven./xsd/maven-4.0.0.xsd' xmlns='http://maven./POM/4.0.0'
  3. xmlns:xsi='http://www./2001/XMLSchema-instance'>
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>com.nancy</groupId>
  7. <artifactId>DemoParent</artifactId>
  8. <version>0.0.1-SNAPSHOT</version>
  9. </parent>
  10. <artifactId>DemoParent-Son3</artifactId>
  11. <version>0.0.1-SNAPSHOT</version>
  12. <packaging>war</packaging>
  13. <dependencies>
  14. <dependency>
  15. <groupId>com.nancy</groupId>
  16. <artifactId>DemoParent-Son2</artifactId>
  17. <version>0.0.1-SNAPSHOT</version>
  18. <type>war</type>
  19. </dependency>
  20. </dependencies>
  21. <build>
  22. <finalName>DemoParent-Son3</finalName>
  23. <!-- 配置中有点说明下:把jar包自动拷贝到web-inf目录地下,这个搞web开发都懂是为什么了 -->
  24. <plugins>
  25. <plugin>
  26. <artifactId>maven-antrun-plugin</artifactId>
  27. <executions>
  28. <execution>
  29. <id>copy-lib-src-webapps</id>
  30. <phase>package</phase>
  31. <configuration>
  32. <tasks>
  33. <delete dir='WebContent/WEB-INF/lib' />
  34. <copy todir='WebContent/WEB-INF/lib'>
  35. <fileset dir='target/${artifactId}/WEB-INF/lib'>
  36. <include name='*' />
  37. </fileset>
  38. </copy>
  39. </tasks>
  40. </configuration>
  41. <goals>
  42. <goal>run</goal>
  43. </goals>
  44. </execution>
  45. </executions>
  46. </plugin>
  47. </plugins>
  48. </build>
  49. </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的一项缺省配置,该设置如下面所示:
  1. <build>
  2. <plugins>
  3. <plugin>
  4. <artifactId>maven-war-plugin</artifactId>
  5. <configuration>
  6. <attachClasses>true</attachClasses>
  7. </configuration>
  8. </plugin>
  9. <plugins>
  10. <build>
启用attachClasses选项可以把JAR文件(DemoParent-Son2.jar)和标准的WAR文件同时安装到Maven仓库中。要访问该JAR文件,我们需要像如下所示的那样修改DemoParent-Son3项目的依赖列表。
  1. <dependencies>
  2. <dependency>
  3. <groupId>com.nancy</groupId>
  4. <artifactId>DemoParent-Son2</artifactId>
  5. <version>0.0.1-SNAPSHOT</version>
  6. <type>jar</type>
  7. <classifier>classes</classifier>
  8. <scope>provided</scope>
  9. </dependency>
  10. <dependency>
  11. <groupId>com.nancy</groupId>
  12. <artifactId>DemoParent-Son2</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <type>war</type>
  15. </dependency>
  16. </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,如下:
  1. public class Test {
  2. public static void main(String[] args) {
  3. Student s = new Student();
  4. s.setName('aaaa');
  5. System.out.println(s.getName() '1111111');
  6. }
  7. }
运行一下,发现输出栏有我们要的值。
源代码链接https://pan.baidu.com/s/13baE0YjgbEGbM263MRWb5g
提取码4y45

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多