Gradle with JDK18+ 中文乱码配置
在 Java18 之后, 当使用 System.out.println() 输出中文的时候, 不管源码是不是以 utf8 编译,无论执行的代码是否是预编译的代码, 只能得到一个结果: 乱码
在经历了长时间的更新换代之后, 终于, Gradle with JDK 18+, 又又又又又乱码了!
分析我首先想到了是不是需要额外加一个 vm option -Dfile.encoding=UTF-8, 然后我在 IDEA 里的运行任务加上了这个参数…. 并没有什么效果
依然得到的还是乱码….
后面又去检查了 gradle.properties, idea64.vmoptions, 都是附带 -Dfile.encoding=UTF8 的… 是什么原因呢?
然后我突然想起来, 在 Gradle 项目中, 在 IDEA 里运行 java main 目标其实是由 Gradle 启动的而不是由 IDEA 直接启动的, 并且 Gradle 是有运行日志的, 然后我直接就打开了 Gradle 目录并找到了日志
Gradle 的日志位于 $GRADLE_USER_HOME/daemon/$version/d ...
Windows SSHD setup | Windows SSHD 配置
Environment PrepareI don’t know if anyone else has noticed, Windows 10 has OpenSSH builtin. sshd.exe found in C:\Windows\System32\OpenSSH. It means now you can connect to windows using ssh.
不知道有没有人留意过, Windows 10 开始内置了 OpenSSH, 其中就有 sshd.exe. 也就是说, Windows 内置的 OpenSSH 拥有启动 SSHD 的功能.
After searching Services. I found OpenSSH Server in services. It is disabled by default.
在翻看服务列表后, 果然找到了 OpenSSH Server, 默认是需要手动启动的.
Start the service, type ssh karlatemp@::1, type my password. Done!
在启动后, 执行 s ...
使用 GnuPG 在公开平台交换数据
环境准备
GPG
对于 Windows, Git for Windows 自带 GPG 支持
123456789B:\test>where base64F:\Exes\Git\usr\bin\base64.exeF:\Exes\cygwin64\bin\base64.exeB:\test>where gpgF:\Exes\Git\usr\bin\gpg.exeB:\test>where curlC:\Windows\System32\curl.exe
确定信息要发送的目标首先需要确定信息要发给哪个人, 然后你需要向你需要发送的目标问到她的 GPG 公钥
在问到 GPG 公钥后, 可使用 gpg --import publickey.txt 来导入她的 GPG 公钥
对于 GitHub, 你可以通过 https://github.com/${username}.gpg 来得到她的 GPG 公钥
比如, 如果你想给 Karlatemp 交换私密消息, 你可以通过打开 https://github.com/Karlatemp.gpg 来得到 Ka ...
使用自定义 CA 生成 HTTPS 证书
Raw JavaCode
使用 jdk.foreign 访问本机代码
jdk.foreign 与 JDK 16 开始可用, 并处于测试状态.
代码在Windows 10 Enterprise; 1909 (OS Build 18363.1679)openjdk 17 2021-09-14; 64-Bit Server VM (build 17+35-2724, mixed mode, sharing)下测试通过
Environment prepare开始一切之前, 需要准备好所有的一切东西
Java IDE
JDK 16+
C/CPP IDE (Optional)
Project initiation首先,新建文件夹, 然后点击 Win, 点击关机, 使用 Java IDE 打开该文件夹.
创建以下文件
123456## gradle/wrapper/gradle-wrapper.propertiesdistributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distsdistributionUrl=https\://services.gradle.org/distribution ...
GitHub PullRequest 自动审核合并
众所周知, github actions 可以完成很多自动化任务, 比如代码持续CI, 版本发布自动化, new issue 内容检查等.
当然,github actions 也可以用作 PR 自动审查合并, 不过, 要完成这些需要一些额外的配置..
首先需要知道的是, on: pull_request 的 workflow 是只有 readonly 的权限的, 这也就意味着通过 on: pull_request 发起的 workflow 除了读取已公开的内容之外什么都干不了. 包括访问 ${{ secrets.XXXX }} 也是不被允许的
需要完成自动合并, 需要更高权限(也意味着更危险的) workflow, pull_request_target
pull_request_target 与 pull_request 的用法基本一致, 但是主要有以下的区别
actions/checkout@v2 会签出到被 PR 的分支(也就是源仓库的内容), 而不是经过 PR 修改后的内容
pull_request_target 拥有 write 权限 ...
Java 动态模块系统 | Java dynamic module system
前言在使用高版本的时候, 总会不可避免的接触到模块系统, 比如反射操作 java.base 已经十分困难. 既然 JDK 内部可以享受到模块的保护, 那么我们自己的代码是否也可以享受到模块系统的保护呢
当然可以,而且也不是非常麻烦。
使用模块,你将面对以下问题
得到反射保护, 外部代码将不能通过反射强行修改/调用私有成员
更严格的访问控制, 不能直接访问非 required 的模块
失去 --add-opens=....=ALL-UNNAMED 的归属判断
需要专门的 ClassLoader / 需要自行实现 ClassLoader
使用模块的适用情况
需要编写严格的附属(插件)系统
需要保护自身代码/保护自身内存空间
觉得弄着好玩
定义一个模块
注: 此处的定义指的是, 通过运行时代码在运行时定义一个模块.而不是大多数资料说的直接写一个 module-info.java
要定义一个模块, 首先需要一个模块的描述符文件 (ModuleDescriptor), 可以从以编码文件读取 (ModuleDescriptor.read(InputStrea ...
JVM 权限逃逸技术
前言: 仅研究 JDK 9+, JDK 8- 无研究意义
从 Java 9 开始, Java 引入了一个新的概念, 模块(Module). 模块的存在, 限制了反射技术, 在 JDK 16 中, 直接反射越权修改 java.base 甚至会得到错误 java.lang.reflect.InaccessibleObjectException, 对于某些需要的 devops 而言意味着无法完成预期操作
在阅读 java.lang.reflect.AccessibleObject 源码后, 有如下代码片段
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980/** * If the given AccessibleObject is a {@code Constructor}, {@code Method} ...
Hello~
This is my first post.