文章目录
1. 关于module、dependency的结论
原则上,
- 如果在父目录下有多个module,最好是在父pom里用
<module>
标签都指明出来,即使它们之间有相互依赖。 - 在每个module的pom里,都指定parent为父目录的pom,即使你认为它们之间有相互依赖。
- 如果A module要依赖B module的代码,那么要在dependencys里面写出来。
2. case1 - 整体结构
2.1. 分析依赖
2.1.1. 目录springboot-plus
- springboot-plus是父目录,里面包含admin-console、admin-core目录
- springboog-plus的pom是:
- artifactId是admin
<groupId>com.ibeetl</groupId>
<artifactId>admin</artifactId>
<version>1.3.2</version>
<packaging>pom</packaging>
<modules>
<module>admin-core</module>
<module>admin-console</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
</parent>
2.1.2. 目录admin-console
- 打的jar包
- 指定了parent是admin,admin版本是1.3.2
- relativePath 指向的是admin的pom
<artifactId>admin-console</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>com.ibeetl</groupId>
<artifactId>admin</artifactId>
<version>1.3.2</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>admin-core</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
2.1.3. 目录admin-core
- 打的jar包
- 指定了parent是admin,admin版本是1.3.2
- relativePath 指向的是admin的pom
<artifactId>admin-core</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>com.ibeetl</groupId>
<artifactId>admin</artifactId>
<version>1.3.2</version>
<relativePath>../pom.xml</relativePath>
</parent>
3. case2 - 整体结构
最终想要达到的目的:
- inventory打出来的是可执行jar包,通过java -jar inventory.jar执行
- inventory里可以引用admin-core和admin-console里的代码
- admin-console可以应用admin-core的代码
3.1. 依赖分析
3.1.1. 目录springboot-plus
- pom里的关键,是要指定3个module,即使它们内部会有maven引用关系。3个module都要明确的列出来。
- pom里不需要有dependency,如果有的话,子module会继承。
<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.ibeetl</groupId>
<artifactId>admin</artifactId>
<version>1.3.2</version>
<packaging>pom</packaging>
<modules>
<module>admin-core</module>
<module>admin-console</module>
<module>inventory</module>
</modules>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<commons-lang3.version>3.3.2</commons-lang3.version>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
</parent>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3.1.2. 目录inventory
- 要指定parent,是父工程的pom.xml
- 因为inventory依赖admin-core得代码,所以denpendency要写admin-console和admin-core,即使这2个会相互依赖。其实只写admin-console也行,因为admin-console引用了admin-core。
<groupId>com.meteor</groupId>
<artifactId>inventory</artifactId>
<version>1.0</version>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<commons-lang3.version>3.3.2</commons-lang3.version>
<maven.test.skip>true</maven.test.skip>
</properties>
<parent>
<groupId>com.ibeetl</groupId>
<artifactId>admin</artifactId>
<version>1.3.2</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>admin-core</artifactId>
<version>1.3.2</version>
</dependency>
<!-- admin-console 包含了系统管理管理的所有功能,子系统可以不使用这部分 -->
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>admin-console</artifactId>
<version>1.3.2</version>
</dependency>
...
3.1.3. 目录admin-console
- 要指定parent,是父工程的pom.xml
- 因为admin-console会依赖admin-core,所以denpendency要写admin-core。
<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>
<artifactId>admin-console</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>com.ibeetl</groupId>
<artifactId>admin</artifactId>
<version>1.3.2</version>
<relativePath>../pom.xml</relativePath>
</parent>
<dependencies>
<dependency>
<groupId>com.ibeetl</groupId>
<artifactId>admin-core</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
</project>
3.1.4. 目录admin-core
这个没有依赖,只有父亲
- 要指定parent,是父工程的pom.xml
<artifactId>admin-core</artifactId>
<packaging>jar</packaging>
<parent>
<groupId>com.ibeetl</groupId>
<artifactId>admin</artifactId>
<version>1.3.2</version>
<relativePath>../pom.xml</relativePath>
</parent>
<properties>
<maven.test.skip>true</maven.test.skip>
</properties>
...
4. 关于springboot打jar包的一些注意项
4.1. 场景1:仅仅打可执行jar包
根据上面的case2描述,如果inventory的pom.xml这么打包,那么打出来的就是springboot的可执行jar包,可以通过java -jar inventory.jar来启动。
<!-- 打包构建设置 -->
<build>
<!-- 选择构建的插件 -->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<!--在添加了该插件之后,当运行“mvn package”进行打包时,会打包成一个可以直接运行的 JAR 文件,使用“java -jar”命令就可以直接运行。这在很大程度上简化了应用的部署,只需要安装了 JRE 就可以运行。-->
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
<!-- 最终包名 -->
<finalName>inventory</finalName>
</build>
4.2. 场景2:会打出2个jar包
如果在plugin里面加个配置,可以打出来2个jar包,如下,有什么不同,阅读以下备注:
<!-- 打包构建设置 -->
<build>
<!-- 选择构建的插件 -->
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<!--在添加了该插件之后,当运行“mvn package”进行打包时,会打包成一个可以直接运行的 JAR 文件,使用“java -jar”命令就可以直接运行。这在很大程度上简化了应用的部署,只需要安装了 JRE 就可以运行。-->
<artifactId>spring-boot-maven-plugin</artifactId>
<!--加下面的配置,将会打出来2个jar包,一个是普通jar包,用以被其他war或jar引用到lib中;另一个是springboot的可执行jar包,以-exec.jar结尾,通过java -jar命令执行-->
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
<!-- 最终包名 -->
<finalName>inventory</finalName>
</build>
打出来的结果是:
在我们这个实验里,如果admin-core只写了下面这个(打-exec.jar注释了):
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!-- <configuration>-->
<!-- <classifier>exec</classifier>-->
<!-- </configuration>-->
</plugin>
</plugins>
</build>
原因:这种情况下,admin-core打出来的是一个springboot的可执行jar包,目录结构不满足普通jar包的格式,自然找不到里面的class。
打出来的jar包内容是这样:
普通的jar包内容应该是这样: