springboot打包后包中没有jar包,项目结构也不对

今天新建了一个项目,打包时遇到一堆问题

首先说一下正常打包后的文件结构:

├── 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跑没问题,打包后找不到页面,原因参考:

SpringBoot项目打包jar后运行报错Error resolving templ ate [XXX], template might not exist_若依 jar 运行报错 某一个页面提示error resolving template [/busi-CSDN博客

错误版本:

这种路径写法会被系统认为是:/templates//index找不到路径

正确版本:

应该写成:return "index"; 去掉斜杠:

@Controller
public class SampleController {
    @GetMapping("/to_index")
    public String toIndex(){
        System.out.println("index.html access");
        return "index";
    }
}

  • 10
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值