前言:
(1)vx_parent为父工程
(2)vx_common为vx_parent子工程,其为其他所有同级模块中引入的公共模块
(3)vx_sale1为vx_parent子工程,其为需要运行的模块
(4)vx_sale2为vx_parent子工程,其为需要运行的模块
(5)vx_sale1、vx_common、vx_sale2为同级模块。
具体架构图如下图所示:
- 将vx_parent模块中的下面这行代码去掉,因为其是父模块,只用于做版本控制和引入基本的依赖,不需要打包成可执行文件
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
- vx_common模块也不需要打包成可执行文件,所以也不需要这个插件。(其他所有不需要打包成可执行文件的模块都不需要这个插件)
- 其它所有需要执行的子模块,都需要打包成可执行文件,本文中vx_sale1模块依赖中vx_sale2模块,在不做额外配置的情况下,普通的jar先生成,可执行jar后生成,这种情况下可执行jar会覆盖普通jar,而我们vx_sale1模块中要引入vx_sale2模块的普通jar,就需要在可执行的子模块的pom.xml中写下如下代码
如果在vx_parent中进行全局打包的话;
vx_sale2先打包的话;
vx_sale1想引入vx_sale2中的模块依赖;
但是普通jar却被可执行jar覆盖了;
vx_sale1就引入不成功了,所以打包就不会成功了;
报错为:找不到vx_sale2中的一些类和接口;
解决方案:
4. 这种情况下就需要在可执行的子模块的pom.xml中写下如下代码;
5. 官方告诉我们,你如果不想移代码,好吧,我这样来给你解决,给你打两个jar包,一个用来直接执行,一个用来依赖。
6. 于是,你需要指定一个属性classifier,这个属性为可执行jar包的名字后缀。
7. 比如我设置<classifier>exec</classifier>,原项目名为vx_sale2。
8. 那么会得到两个jar:vx_sale2.jar和vx_sale2-exec.jar。
9. 我们打包vx_sale1的时候会引入vx_sale2.jar。
10. 我们在执行的时候需要执行exec结尾的文件。
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<classifier>exec</classifier>
</configuration>
</plugin>
</plugins>
</build>
- 接下来我们只需要在vx_parent中使用命令(这里是在文件夹中,使用cmd进行打包)
12. mvn clean
13. mvn package
14. 或者直接使用mvn clean package
- 等待一段时间,打包完成之后,我们的可执行jar包就在我们的可执行模块的target文件夹中,此时我们会看到生成两个jar包,一个是.jar,另一个是exec.jar。
- 执行的时候在exec.jar页面,打开控制台,输入:
17. java -jar vx_sale2-exec.jar
这样我们的vx_sale2模块就会执行了。
18. java -jar vx_sale1-exec.jar
这样我们的vx_sale1模块就会执行了。
19. 后台执行,这样我们使用`Ctrl + C`就不会中断我们的程序了
nohup java -jar vx_sale1-exec.jar &
nohup java -jar vx_sale2-exec.jar &
如果想结束进程的话,使用`ps -ef | grep java`查看进程端口号,使用`kill -9 具体端口号`结束掉即可
`具体日志在nohup.out文件中`