解压文件恢复为war
$ ls ROOT
org WEB-INF META-INF
$ jar cfv0M ROOT.war .
# 或者使用 winrar 7zip等工具 创建压缩文件,选择ZIP格式的 “存档”(Store)模式。
JDK 8 无痛升级到 JDK 11
只需要在源码增加依赖,或是在 jar 包或是 war 包中增加依赖包,就可以把运行环境由JDK8 升级到 JDK11.
jdk8to11-pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>jdk8to11</groupId>
<artifactId>jdk8to11</artifactId>
<version>1.0</version>
<dependencies>
<dependency>
<groupId>com.sun.activation</groupId>
<artifactId>jakarta.activation</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>jakarta.transaction</groupId>
<artifactId>jakarta.transaction-api</artifactId>
<version>1.3.3</version>
</dependency>
<!-- API -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.3</version>
</dependency>
<!-- Runtime -->
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.3</version>
<scope>runtime</scope>
</dependency>
<!-- Alternative runtime -->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
<scope>runtime</scope>
</dependency>
<!-- API -->
<dependency>
<groupId>jakarta.xml.ws</groupId>
<artifactId>jakarta.xml.ws-api</artifactId>
<version>2.3.3</version>
</dependency>
<!-- Runtime -->
<dependency>
<groupId>com.sun.xml.ws</groupId>
<artifactId>jaxws-rt</artifactId>
<version>2.3.3</version>
</dependency>
<dependency>
<groupId>jakarta.annotation</groupId>
<artifactId>jakarta.annotation-api</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
</project>
## JDK 8 to JDK 11
java11 报sun.misc.BASE64Decoder 这个不存在
原因: rt.jar 在 JDK 9 已经删除了。
解决办法:修改代码,直接用 java.util.Base64.Encoder 和 java.util.Base64.Decoder 替代使用。(支持JDK8及以上)
把 jdk 8 中的 rt.jar 上传到私服上.
## WebService 依赖包 for jdk11
implementation group: 'javax.xml.ws', name: 'jaxws-api', version: '2.3.1'
implementation group: 'javax.jws', name: 'javax.jws-api', version: '1.1'
## JAXB 依赖包 for jdk11
implementation "javax.xml.bind:jaxb-api:2.3.0"
implementation "com.sun.xml.bind:jaxb-core:2.3.0"
implementation "com.sun.xml.bind:jaxb-impl:2.3.0"
implementation "javax.activation:activation:1.1.1"
// replacements for deprecated JDK module java.xml.ws
runtimeOnly 'javax.xml.ws:jaxws-api:2.3.0' // javax.xml.ws.* classes
runtimeOnly 'javax.jws:jsr181-api:1.0-MR1' // for javax.jws.* classes
// replacement for deprecated JDK module java.xml.bind
runtimeOnly 'org.glassfish.jaxb:jaxb-runtime:2.3.0.1'
runtimeOnly 'org.glassfish:javax.json:1.1.2'
runtimeOnly 'org.eclipse:yasson:1.0.1'
MVN 可执行 war/jar
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
</configuration>
</plugin>
Gradle 性能优化
cat /usr/local/gradle-6.4.1/gradle.properties
org.gradle.daemon=true
org.gradle.parallel=true
org.gradle.caching=true
org.gradle.jvmargs=-Xmx5120m -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError
## 设置 gradle 全局 仓库地址,忽略项目中指定的仓库地址。
$ GRADLE_USER_HOME/init.gradle
// gradle脚本依赖仓库
gradle.projectsLoaded {
rootProject.buildscript {
repositories {
maven {
allowInsecureProtocol = true
url "http://www.nexus.com:8081/repository/repo1/"
credentials {
username 'xxx'
password '****'
}
maven {
allowInsecureProtocol = true
url "http://www.nexus.com:8081/repository/repo1/"
credentials {
username 'xxx'
password '****'
}
}
}
}
}
// 项目依赖仓库
allprojects {
repositories {
maven {
allowInsecureProtocol = true
url "http://www.nexus.com:8081/repository/repo1/"
credentials {
username 'xxx'
password '****'
}
maven {
allowInsecureProtocol = true
url "http://www.nexus.com:8081/repository/repo1/"
credentials {
username 'xxx'
password '****'
}
}
}
gradle 7 以上要求 mvn 仓库使用https 协议。
可以增加 allowInsecureProtocol = true 继续使用http 协议。
repositories {
maven {
allowInsecureProtocol = true
url "http://www.nexus.com:8081/repository/xxx/"
credentials {
username 'xxx'
password '******'
}
}
// mavenCentral()
}
下载jar 文件到本地
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>springframework</groupId>
<artifactId>project</artifactId>
<version>1.0</version>
<!-- 下载相应jar包依赖 -->
<dependencies>
<dependency>
<groupId>dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>1.6.1</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
</project>
download.bat
call mvn -f pom.xml dependency:copy-dependencies
@pause
启动报错: java.lang.NoClassDefFoundError: javafx/util/Pair
原因: Oracle JDK 8 Linux ARM 架构包、Oracle JDK 11+、Openjdk 8+ 等环境都没有带 jfxrt.jar,然而 x86 架构的 Oracle JDK 1.8 是有这个包。
( 路径在 $JAVA_HOME/jre/lib/ext/jfxrt.jar)
解决办法:
- 如果你使用的是 JDK 1.8, 可以将 Oracle JDK X86 的 jfxrt.jar 拷贝出来,上传到私有仓库,坐标可以设置为:
<dependency>
<groupId>javafx</groupId>
<artifactId>jfxrt</artifactId>
<version>1.0</version>
</dependency>
并将代码引用这个依赖,即可以解决依赖问题。
- 如果你使用的是 JDK 11 或更高的版本,可以引入依赖:
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-base</artifactId>
<version>17</version>
</dependency>
以上两种办法均可以,并不需要网上说的修改JDK环境。
A环境正常,B环境启动报错: java.lang.NoSuchMethodError:javax.validation.BootstrapConfiguration.getClockProviderClassName
原因:validation-api-1.1.0.Final.jar validation-api-2.0.0.Final.jar 两个版本的jar包冲突,删除旧版本问题解决。
A环境正常,B环境启动报错:Caused by: java.lang.VerifyError: class io.netty.channel.nio.NioEventLoop overrides final method pendingTasks.()
原因:netty 存在多个版本,删除旧版本,保留最新版,问题解决。
JDK 17
gradle 7.3+
lombok 1.18.22
https://github.com/gradle/gradle/issues/16857
ZK
cat /app/zk/conf/zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
clientPort=2181
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/app/zk/data
dataLogDir=/app/zk/logs
metricsProvider.className=org.apache.zookeeper.metrics.prometheus.PrometheusMetricsProvider
metricsProvider.httpPort=7000
admin.serverPort=7001
clientPort=2181
server.1=zk1.infra.dev:2881:3881
server.2=zk2.infra.dev:2881:3881
server.3=zk3.infra.dev:2881:3881
autopurge.snapRetainCount=10
autopurge.purgeInterval=48
cat /app/zk/data/myid
2
cat /etc/systemd/system/zk.service
[Unit]
Description=zookeeper server daemon
After=syslog.target network.target
[Service]
Alias=zookeeper.service
Environment=JAVA_HOME=/usr/java/latest
Environment=ZOO_LOG_DIR=/app/zk/logs
Environment=ZOOCFGDIR=/app/zk/conf
Type=forking
WorkingDirectory=/home/app
PermissionsStartOnly=true
ExecStartPre=/bin/mkdir -p /app/zk/conf /app/zk/data /app/zk/logs
ExecStartPre=/bin/chown app -R /app/zk/conf /app/zk/data /app/zk/logs
ExecStart=/usr/local/zk/bin/zkServer.sh start
ExecStop=/usr/local/zk/bin/zkServer.sh stop
#ExecReload=/bin/kill -s HUP
#ExecStop=/bin/kill -s QUIT
#PrivateTmp=true
User=app
KillMode=process
KillSignal=SIGTERM
[Install]
WantedBy=multi-user.target
网友评论