idea配置多module工程&Springboot打包

11 篇文章 0 订阅
5 篇文章 0 订阅

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包内容应该是这样:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值