很早之前就一直在维护一个git仓库,平时调研什么组件就会在里面新建一个springboot的工程用来编写示例代码。
最一开始使用的是SpringInitializr,后来网站更新之后,只能生成JDK17+的工程,WhatTheFuck?近期刚从8切换到11.
于是弃用并改用 StartAliyun。
今天调研ClickHouse,生成的工程pom-build是这个样子的 :
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>11</source>
<target>11</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring-boot.version}</version>
<configuration>
<mainClass>com.ramble.clickhouse.ClickhouseApplication</mainClass>
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
然后发现打的jar只有7KB,WhatTheFuck!我需要它能生成可以正常运行的jar。
后面就是围绕怎么让maven输出jar展开了。
思虑片刻,想起来了,之前遇到过这样的问题,原因是用maven-compiler-plugin打包就不行,需要用Spring-boot-maven-plugin,于是删除了 maven-compiler-plugin 所在的plugin节点。
新问题出现了:
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:compile (default-compile) on project clickhouse: Compilation failure: Compilation failure:
[ERROR] 不再支持源选项 5。请使用 6 或更高版本。
[ERROR] 不再支持目标选项 1.5。请使用 1.6 或更高版本。
WhatTheFuck!!!怎么还1.5了,那里冒出来的,明明在StartAliyun选中的是11。
可以肯定的是打包的时候找到的JDK版本是1.5,而预期的是11,预期和实际不一致,所以是设置的问题。
按照经验来说这时候该检查 IDEA SETTINGS 和 ProjectStructure了,检查的结果是这两个位置确实是1.5。
好消息是报错的直接原因找到了,坏消息是根本原因还没有找到。
在看一下报错log,发现了这一句话:
Failed to execute goal......
也就是说它找的是全局级别的设置,而不是我项目中设置的,那这个全局是在哪里呢?难道是maven的settings.xml?
同时将去掉的maven-compiler-plugin恢复回来package又正常了。这里基本可以确认 goal 就是指 Maven 的settings.xml了, 因为maven-compiler-plugin中设置了JDK。
那问题太似乎简单了,在settings.xml中设置一下不就行了,代码如下:
<profile>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
</profile>
满心欢喜的试一波,哎哟,package不报错了。
然而,生成的jar还是7KB。。。。。。 WhatTheFuck.....
先稳一波,虽然通过设置全局解决了,但是也仅解决了当下的问题,万一明天再搞个JDK22的项目,不还是会预期和实际不一致???
既然全局的settings.xml中设置jdk生效,那工程中设置一样生效,因为依稀记得好好好几年前撸MAVEN的时候工程中的配置会覆盖全局的,于是在pom中的properties下添加上述配置,果然好使。
后面的故事就是:
最终,当我把这个工程的pom和其他正常的工程pom做对比的时候,发现多了一个skip=true的配置
<build>
<plugins>
<plugin>
......
<configuration>
......
<skip>true</skip>
</configuration>
......
</plugin>
</plugins>
</build>
skip什么意思?跳过。
你要跳过什么?反正你是跳过了!跳过了就7KB了!!!
精准搜索了一下,这里的跳过是:跳过打包 。
WhatTheFuck......
注释这个之后,问题确实解决了,好了,天晴了,雨停了......
可是,为什么StartAliyun默认要Skip=true呢?着实想不明白,不行我还得找找其他的 Initializr ,这个不喜欢用。
记录一次开发中遇到的关于 ThreadLocal 问题,场景是数据库表中的操作人总是无缘无故的被更改,排查了几遍代码才发现是 ThreadLocal 没有及时清理导致的。