问题背景
先说一下背景:
其一,公司使用的云主机,无法连接外网,所以无法直接创建SpringBoot项目!
其二,我是🐷,这是用来记录自己蠢到家的一篇文章
最近在工作中的一个新项目遇到了SpringBoot打jar包到服务器上无法执行,打包的时候就感觉jar包也太小了吧,而且还没有xxx.jar.original的文件同时生成,而且一运行就提示没有主类的问题
no main manifest attribute, in xxx.jar
下图为我在mac上运行的结果,为了问题重现而已,在linux会报最上面一行的错误,意思都是一样的
但是在本地Idea中可以正常运行,而且,讲道理来说SpringBoot项目打包明明可以直接运行,而且之前SpringBoot项目也是这么运行的都没问题啊,为啥服务器上运行就找不到主类呢?
真的是百思不得其姐,于是百度了一下,发现了几种解决办法:
解决方法一(PASS)
使用 java -cp jar包位置 启动类全类名 ,如:
java -cp /data/testDemo.jar com.rayacai.Application
但是这也只能临时的指定路径让项目跑起来,这明明已经是另一种启动方式了,并没有彻底解决
再说,我也不可能将一个“正常”的SpringBoot项目以这种方式来进行每次服务器的部署啊!
于是,又开始寻找另一个方法…
解决方法二(PASS)
在某一篇文章里找到了这段代码,于是被我直接拉了过来
想在本地试一下,结果…直接原地爆炸!
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<mainClass>com.sf.App</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
发生了什么情况呢?
我的程序maven依赖包错,删除此build标签后,依赖不报错了,可以clean,但是无法package,发现是编译问题
于是我的项目现在连build/rebuild重新编译都无法通过
报错找不到所有的mapper的xml文件
再到文件夹中查看,target文件夹拒绝访问,无法删除
心想,完了,这特么弄个主类把项目都弄炸了还得重新从svn上拉下来再把新代码搞过去
后来想着死马当活马医,重启一下吧
target无法删除问题解决!!!!!!
重启后,那个无法删除的target文件夹已经自动消失了,可以编译和正常启动了,这段代码也就没敢再试,PASS!
解决方法三(BINGO)
这时候陷入了僵局
开始和其他SpringBoot项目比对<dependency>,因为是手动maven创建的项目,之后才引入的SpringBoot的相关依赖,所以总以为是依赖少引入了
后来想到的是少写注解啥的了,又开始找注解的问题…
其实在这个过程中有发现jar包中的META-INF文件夹下的MANIFEST.MF中没有主类MainClass,但是没有找到原因,为什么会没有…
后来突然想到方法二的build标签思路是不是对的?
就比对了其他SpringBoot项目中的pom.xml才发现,原来SpringBoot项目是要有build标签的
但是内容只有这几行
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
看到这我也知道自己蠢,为啥没早进行比对呢
其实我也早对比了,但是就没想到build这块,一直在对比依赖部分
(好吧,其实我就是蠢!!!)
加上这个build标签后,该有的东西都有了,完美解决!!!!
后记
对于SpringBoot平时对于自己写练习的时候都是插件直接联网在线创建,而且在公司里也都是在现有项目中进行业务逻辑开发,不会说用maven手动搭建SpringBoot的项目
像我们这种开发环境禁止联网只能手动创建maven新项目再引入SpringBoot依赖的情况也是极少数了
但是,这次也是给个教训,记一下SpringBoot的基本框架最基本需要哪些东西,不要各种框架、插件用多了,忘记了最基本的构建方式和结构了。