综合/最新
Java编程专题、Nginx Jetty HTTP C/S、Java Web、Android应用开发、JDK源码、Gradle构建
原则 - 主用JDK版本选择安装版,备用JDK则用压缩版。
Java/JDK下载地址
Linux安装:apt install default-jre (Debian默认为JDK21) 或用解压缩方式:
wget https://download.oracle.com/java/24/latest/jdk-24_linux-aarch64_bin.tar.gz 或 jdk-24_linux-x64_bin.tar.gz
tar -xf jdk-24_linux-*64_bin.tar.gz
Java程序打包:
完整JDK/JRE方式:
JRE自定义镜像方式:
cd "C:\Program Files\Java\jdk-24\bin"
./jlink --help 只含 java.base 则生成后约 30-47MiB。
[可选] 查看依赖的modules: jdeps HelloWorld.class
不含应用: ./jlink --output $HOME/Desktop/my-jre/ --add-modules java.base
./jlink --output $HOME/Desktop/my-jre/ --add-modules java.base,jdk.localedata --include-locales en,zh-Hans-CN --strip-debug --compress=zip-9
说明 - 不指定 --module-path 则默认取 JDK 目录 jmods/;可指定 jar(不指定模块名则取文件名) 和通过 jar 或 *.class 生成的 jmod 文件。
其中 --strip-debug --compress=zip-9 参数均为可选,但建议加上,压缩似乎只针对 my-jre/lib/modules 文件。
包含应用: ./jlink --output $HOME/Desktop/my-jre/ --module-path ../jmods/:path/to/your-modular.jar:your-modular.jmod --add-modules java.base
说明 - 运行命令 java --module your.modular/HelloWorld.class
其他参数:如果想重用参数,可通过配置文件指定 ./jlink @my.conf
--add-modules java.base,javafx.base,javafx.graphics,javafx.controls --launcher start=java.base/java
指定本地化语言(默认en_US) ./jlink --add-modules java.base,jdk.localedata --include-locales en,ja,zh-Hans-CN
清理输出目录: rm -r $HOME/Desktop/my-jre/
[可选] 创建jmod文件: jmod create --class-path mods/com.example.mymodule --output mymods/com.example.mymodule.jmod --module-version 1.0.0 --main-class com.example.mymodule.MyClass --resource-path resources
新:
Oracle GraalVM 仅支持 CycloneDX 生成 SBOM,暂不支持 SPDX 格式。
JDK 24+:
支持 ASM 能力 java.lang.classfile.ClassFile.of().parse(byte[] bytes)
通过预缓存加快启动速度 java -XX:AOTCache=app.aot -jar app.jar
通过--enable-linkable-runtime减少JDK镜像尺寸,从JDK_HOME\jmods\抽取所用classes。
Stream.of(1, 2, 3).gather(Gatherers.mapConcurrent(3, (item) -> {
return item * item; // Thread.currentThread().isVirtual()
})).toList(); // map 未使用 VirtualThread;JDK 24+ 首选 mapConcurrent
Java/JDK版本重大变化:
Java 18+ 默认编码统一为 StandardCharsets.UTF_8
Java 9+ 引入了JPMS(Java Platform Module System)
死记、偏门:
常量 - 编码方式 StandardCharsets.UTF_8、换行符 System.linSeparator()、本机地址 InetAddress.getLocalHost().getHostAddress()
目录 - 当前目录 System.getProperty("user.dir") 在MAC DOCK上启动则总为“/”,Windows正常; Path对象不含结尾的斜杠。
File.createTempFile("x".repeat(3), ".txt") 返回 File,而 Files.createTempFile(...) 则返回 Path。
其他 - Gradle判断>=Java版本:org.gradle.api.JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_17); 也可用Guava库com.google.common.base.JavaVersion
国名代码 - Locale.getISOCountries(); // 输出2字母大写,等同域名后缀,3字母则更清晰;全名用 locale.getDisplayCountry(Locale.ENGLISH)
时区 - PRC or CTT 即 China Standard Time 上海时区,简短易记。
TimeZone.getTimeZone("PRC").toZoneId();
ZoneId.SHORT_IDS.get("CTT"); // 输出 Asia/Shanghai
ZoneId.of("Asia/Shanghai"); // 完整写法
ZoneOffset.UTC.normalized() // 规范化
无法跳读,直接获取最后一个元素,仍然会接收之前所有元素文件流 - request.getParts().stream().findLast().getInputStream();
时间 - 周年份(Week Year)指跨年周的天数低于4天就归属到新年份了,1月1日永远属于新年份第一周。Java中用YYYY表示周年份,常规年份使用yyyy。
错误响应标准(RFC 9457) - org.springframework.http.ProblemDetail
NetBeans控制台中文乱码解决(macOS无此问题):计算机\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage 将 ACP 值改为 65001。
IDE:
NetBeans - 离线模式 NetBeans -> Tools -> Options -> Java -> Gradle -> ✔Offline
macOS安装包为Apache-NetBeans-25.pkg。
v25 Bug - 时间久了,外部复制后粘贴到编辑器里失效。