作为一个前端程序员,好不容易用第一次使用spring boot 写了一个项目,idea里面运行的ok,心里暗自窃喜。但是没想到打包就出现问题,折腾了一天,现在总结一下;
先看一下我的项目的结构:
![](https://imgconvert.csdnimg.cn/aHR0cDovL25vdGUueW91ZGFvLmNvbS95d3MvcHVibGljL3Jlc291cmNlLzk2YjY0ODllNmFkNjRiOThlOTIzNDMyZGFjMDFiMWI4L3htbG5vdGUvMTExOEU5NUJGQUIzNDk0Njg0MTNGQTNFQTY1RTcyRDMvODIxMA)
这是我的项目,主项目是一个spring boot 项目,用来作为服务端。还有一个ArcFaceSDK模块,这是一个java模块,用来请求服务端。
先说一下ArcFaceSDK模块的打包:
这个比较简单,因为是一个java模块,所以打成jar包就可以了。
首先打开:
![](https://imgconvert.csdnimg.cn/aHR0cDovL25vdGUueW91ZGFvLmNvbS95d3MvcHVibGljL3Jlc291cmNlLzk2YjY0ODllNmFkNjRiOThlOTIzNDMyZGFjMDFiMWI4L3htbG5vdGUvQ0U1QjBBMDM3RTQ4NEU0QjlBNTdGNzM3MEJEREZENkQvODIyMg)
然后,选择artifacts 点击+
![](https://imgconvert.csdnimg.cn/aHR0cDovL25vdGUueW91ZGFvLmNvbS95d3MvcHVibGljL3Jlc291cmNlLzk2YjY0ODllNmFkNjRiOThlOTIzNDMyZGFjMDFiMWI4L3htbG5vdGUvNzZBNDAyQ0IxM0Y4NEQyNjlGREUwMDQ4QjQ2NjdGQjUvODIyNQ)
下一步:
![](https://imgconvert.csdnimg.cn/aHR0cDovL25vdGUueW91ZGFvLmNvbS95d3MvcHVibGljL3Jlc291cmNlLzk2YjY0ODllNmFkNjRiOThlOTIzNDMyZGFjMDFiMWI4L3htbG5vdGUvNEM1NUVEQjRGMzFBNEEzQUE2MjM4RjhGRkZGNDY2QjMvODIyOQ)
下一步,在弹出的对话框中选择要打包的module,如果有mainClass 选择:
![](https://imgconvert.csdnimg.cn/aHR0cDovL25vdGUueW91ZGFvLmNvbS95d3MvcHVibGljL3Jlc291cmNlLzk2YjY0ODllNmFkNjRiOThlOTIzNDMyZGFjMDFiMWI4L3htbG5vdGUvMTU1ODFBNDI1RTdFNDkyQ0JGNjY5OTBBRTlBQzA1MUMvODIzMg)
然后一路ok保存就好。
配置完成,接着就是执行打包。
build-->build Artifacts
![](https://imgconvert.csdnimg.cn/aHR0cDovL25vdGUueW91ZGFvLmNvbS95d3MvcHVibGljL3Jlc291cmNlLzk2YjY0ODllNmFkNjRiOThlOTIzNDMyZGFjMDFiMWI4L3htbG5vdGUvMUZGOTc3M0Y5QzVFNDU5MUExMkJCNTNEODYyNTcyQkUvODI0MA)
![](https://imgconvert.csdnimg.cn/aHR0cDovL25vdGUueW91ZGFvLmNvbS95d3MvcHVibGljL3Jlc291cmNlLzk2YjY0ODllNmFkNjRiOThlOTIzNDMyZGFjMDFiMWI4L3htbG5vdGUvM0E2NEZFMkUxQURBNDUxMzlDMUQ5RkNEOTNGMTEzNjUvODI0Mw)
然后 项目的目录下面就产生了这个jar:
![](https://imgconvert.csdnimg.cn/aHR0cDovL25vdGUueW91ZGFvLmNvbS95d3MvcHVibGljL3Jlc291cmNlLzk2YjY0ODllNmFkNjRiOThlOTIzNDMyZGFjMDFiMWI4L3htbG5vdGUvMjg2Q0M2NUJBRUZBNEVDNjhGNEJFMDg3MkVBRjJDRkIvODI0Ng)
到此,java模块打包成jar完成;
接着是主项目的打包:
首先说明一下 spring boot 项目是自带服务器的,这意味着你可以不依赖其他服务器(比如tomcat)运行。 当你自身运行的时候,只需要电脑上装有java环境即可。当然你也可以不使用自身的服务器。所以这个时候有两种打包方式:
1. 打包成jar, 自身运行;
2. 打包成war,依附于其他服务器运行;
这里介绍第一种。
maven 插件给我们提供了一种很简单的打包方式,就是使用插件自带的功能。
首先打开maven预览:
如果默认没有,可以使用这种方式打开:
![](https://imgconvert.csdnimg.cn/aHR0cDovL25vdGUueW91ZGFvLmNvbS95d3MvcHVibGljL3Jlc291cmNlLzk2YjY0ODllNmFkNjRiOThlOTIzNDMyZGFjMDFiMWI4L3htbG5vdGUvMUQ4MEQxMTNEQjUxNDdGRUJBNkQ1NUE5ODdBQkYyQzAvODI3Mw)
打开后看到lifecycle下面的任务,我们打包需要的就是下面这两个,首先执行一下clean,然后执行一下package,就会生成了。
![](https://imgconvert.csdnimg.cn/aHR0cDovL25vdGUueW91ZGFvLmNvbS95d3MvcHVibGljL3Jlc291cmNlLzk2YjY0ODllNmFkNjRiOThlOTIzNDMyZGFjMDFiMWI4L3htbG5vdGUvMDk1NDQ3NTk2NEUxNEJGMjg1OTk2QzY4NUIzRjZGNTQvODI3OQ)
别着急,在生成之前我们需要对输出文件配置一下,因为是maven提供的打包,所以我们需要在pom里提供配置:
![](https://imgconvert.csdnimg.cn/aHR0cDovL25vdGUueW91ZGFvLmNvbS95d3MvcHVibGljL3Jlc291cmNlLzk2YjY0ODllNmFkNjRiOThlOTIzNDMyZGFjMDFiMWI4L3htbG5vdGUvMTY3NDA5RDQwQkU3NEFDQThFQ0Q5Mjc2MDA4MkNEQjAvODI4Nw)
添加红色框里面的配置,意思是我们即将输出 jar包(也可以配置成war),下面就是jar包的名字和描述,最后生成的文件名会以name和上面的version拼接作为结果。
这时候我们依次点击一下 clean 和 package,生成文件如下:
![](https://imgconvert.csdnimg.cn/aHR0cDovL25vdGUueW91ZGFvLmNvbS95d3MvcHVibGljL3Jlc291cmNlLzk2YjY0ODllNmFkNjRiOThlOTIzNDMyZGFjMDFiMWI4L3htbG5vdGUvRUQ2OURFQkRFNkY0NEQ3Qjk2NDQ2NThBNzFEQjQ1NzkvODI5OQ)
项目启动:
cd 到jar所在的,目录,执行:
java -jar arcfaceserver-0.0.1-SNAPSHOT.jar
就可以了。
好,一般的项目到这里就基本完成了,但是我的启动的时候会报错误,很多Class 没找到。很快我发现了原因,因为我项目中引入了一个本地的jar包文件,而maven打包时没有将它打包进去。
解决办法就是吧本地jar依赖转化为maven依赖,在pom 中添加:
<!--加入本地依赖-->
<dependency>
<groupId>com.arcsoft.face</groupId>
<artifactId>arcsoft-sdk-face</artifactId>
<version>2.2.0.1</version>
<scope>system</scope>
<systemPath>${project.basedir}/src/lib/arcsoft-sdk-face-2.2.0.1.jar</systemPath>
</dependency>
它在我项目中的真实目录为:
![](https://imgconvert.csdnimg.cn/aHR0cDovL25vdGUueW91ZGFvLmNvbS95d3MvcHVibGljL3Jlc291cmNlLzk2YjY0ODllNmFkNjRiOThlOTIzNDMyZGFjMDFiMWI4L3htbG5vdGUvQjhEQkMzMjJERTdFNDhDMkJGODM5NEI5MDlFRTE3QjAvODMxNw)
只添加了这个还不够,运行的时候还是找不到,查了很久,原来还要加上这句话:
![](https://imgconvert.csdnimg.cn/aHR0cDovL25vdGUueW91ZGFvLmNvbS95d3MvcHVibGljL3Jlc291cmNlLzk2YjY0ODllNmFkNjRiOThlOTIzNDMyZGFjMDFiMWI4L3htbG5vdGUvRUY5NkJBQkVBRkM5NDBFNzkwN0M1NDNGQ0EyRDBGRDEvODMyMg)
附上代码:
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--加入下面可以将本地jar打包进去 -->
<configuration>
<executable>true</executable>
<includeSystemScope>true</includeSystemScope>
</configuration>
</plugin>
</plugins>
</build>
到此为止,我的本地jar包终于成功打包进去,运行项目正常。
到这里作为初学者还不是很完美,因为打包后的jar我门怎么动态修改端口号,数据库信息什么的呢?总不能每次修改重新打包啊,我的暂时的解决办法如下:
使用启动命令:
java -jar arcfaceserver-0.0.1-SNAPSHOT.jar --server.port=8084
上面的命令可以配置服务的端口号。
类似的还有下面的参数,这是在application.properties中的参数,都可以以上面的形式配置。
spring.datasource.url=jdbc:mysql://localhost:3306/faceDB
spring.datasource.username=root
spring.datasource.password=xxxxxxxxxxxx
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
# Specify the DBMS
spring.jpa.database = MYSQL
# Show or not log for each sql query
spring.jpa.show-sql = true
# Hibernate ddl auto (create, create-drop, update)
spring.jpa.hibernate.ddl-auto = update
# Naming strategy
spring.jpa.hibernate.naming-strategy = org.hibernate.cfg.ImprovedNamingStrategy
# stripped before adding them to the entity manager
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
#指定端口号
server.port=8082
#指定context path
#server.context-path=/test 被弃用
server.servlet.context-path=/arcfaceserver
当然,把所有参数都写进脚本文件中太不美观,还有一种非常优雅的方式:
在jar文件同级目录建立config文件夹,将application.properties 文件拷贝进去, 就 ok 了。
为什么? 这里拷贝别人的文章中的一段:
应用程序属性文件
SpringApplication 将从 application.properties 以下位置的文件中加载属性并且将其添加到 Spring 的环境当中:
当前目录下的 /config 子目录
当前目录
classpath中的 /config 目录
classpath根目录
该列表按照优先级的顺序排列(在列表中较高的位置定义的属性将会覆盖在较低位置定义的属性)。
如果您不喜欢 application.properties 作为配置文件名,则可以通过指定 spring.config.name 环境属性来切换到另一个名称。还可以使用 spring.config.location 环境属性(以逗号分隔的目录位置列表或文件路径)引用显式位置。
比如:
java -jar myproject.jar --spring.config.name = myproject
1
java -jar myproject.jar --spring.config.location =
classpath:/default.properties,classpath:/override.properties
1
2
java -jar -Dspring.config.location=
D:\speech\default.properties analysis-speech-tool-0.0.1-SNAPSHOT.jar