今天新建了一个项目,打包时遇到一堆问题
首先说一下正常打包后的文件结构:
├── BOOT-INF
│ ├── classes
│ │ ├── application.properties
│ │ └── com
│ │ └── example # 应用的.class 文件目录
│ │ └── demo
│ │ └── DemoApplication.class
│ └── lib # 这里存放的是应用的 Maven 依赖的jar包文件
│ ├── javax.annotation-api-1.3.2.jar
│ ├── ......
│ └── spring-jcl-5.1.8.RELEASE.jar
├── META-INF
│ ├── MANIFEST.MF
│ └── maven
│ └── com.example
│ └── demo
│ ├── pom.properties
│ └── pom.xml
└── org
└── springframework
└── boot
└── loader #存放的是 Spring boot loader 的 class 文件
├── ExecutableArchiveLauncher.class
├── JarLauncher.class
├── archive
│ ├── Archive$Entry.class
│ ├── ...
├── data
│ ├── RandomAccessData.class
│ ├── ...
├── jar
│ ├── AsciiBytes.class
│ ├── ...
└── util
└── SystemPropertyUtils.class
1 运行jar包时报错:.\xxxx-1.0.0.jar中没有主清单属性
造成这个报错的有很多原因,分为一个直接原因,和很多间接原因
直接原因:解压开jar包,可以看到 xxx.jar\META-INF\MANIFEST.MF这个文件,这个文件是用来记录项目打包信息的,用笔记本打开可以看到没有
Main-Class: org.springframework.boot.loader.JarLauncher
所以启动java -jar启动jar包时找不到这个配置,也就找不到启动类,所以报错
解决方法:在idea中设置
然后在resources文件夹下就会自动生成META-INF\MANIFEST.MF
设置后重新打包,也许MANIFEST.MF就正常了,但是我的没有,MANIFEST.MF中还是没有Main-Class属性,于是我选择手动修改MANIFEST.MF,然后将修改保存到jar中
接着就报了新的错误:找不到org/springframework/boot/SpringApplication这个class
原因就是打包后的xxx-1.0.0.jar中没有所依赖的jar包
我有问题的jar解压开的文件结构是这样的,其中根本没有正常的Boot-INF和org文件夹,也就没有依赖的jar包:
网上说没有jar包是pom文件的问题,具体来说都是在<build>标签中的问题,顾名思义就是构建jar包的设置,即:
我根据网上说的加入配置:
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
但是使用maven打包时报错:
Cannot find default setter in class org.springframework.boot.maven.Exclude
最后发现原因,是下面的代码的原因,注释掉就好
<excludes> <exclude>**/Test.java</exclude> </excludes>
这设置的意思时打包时排除掉测试类,因为打包时如果不排除测试类,会导致打包时循环运行测试类,打包进程永远无法停止
所以我只能先把测试类全部注释掉,也将<excludes>标签全部注释掉,发现能正常打包
(2023.12.11更新:学到个新命令 mvn clean package -DskipTest 这个命令可以跳过测试代码打包,就不用注释整个测试类了,同时 mvn clean install -DskipTest 也可以)
(其实有时候不止报Cannot find default setter in class org.springframework.boot.maven.Exclude这个错,我还遇到过说spring版本不够什么的,因为我用的是2.6.7,版本比较老,当时我还信了,但是其实还是pom文件的问题,我删了个什么配置就没问题了,所以千错万错,都是pom的错)
最后的pom文件:
2023.12.27更新
新建了一个springBoot+thymeleaf的项目,idea跑没问题,打包后找不到页面,原因参考:
错误版本:
这种路径写法会被系统认为是:/templates//index找不到路径
正确版本:
应该写成:return "index"; 去掉斜杠:
@Controller
public class SampleController {
@GetMapping("/to_index")
public String toIndex(){
System.out.println("index.html access");
return "index";
}
}