java编译[WARNING]告警处理
一、sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl
[WARNING] HttpUtils.java:[37,46] sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl是内部专用 API, 可能会在未来发行版中删除
1、避免使用内部 API:
尽量使用 Java 标准库提供的公开 API 来替代内部 API。如果可以找到一个更合适的替代方案,尽量不要依赖 sun.* 的包。
2、使用 java.lang.reflect 包:
在大多数情况下,可以使用 java.lang.reflect 包中的类来处理反射和泛型。例如,ParameterizedType 是一个标准 API,通常可以用来替代 ParameterizedTypeImpl。
修改前:
import sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl;Class<?> elementType = TypeUtil.getClass(((ParameterizedTypeImpl) field.getGenericType()).getActualTypeArguments()[0]);
修改后:
import java.lang.reflect.ParameterizedType;Class<?> elementType = TypeUtil.getClass(((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]);
二、sun.net.util.IPAddressUtil
[WARNING] FormatUtil.java:[17,20] sun.net.util.IPAddressUtil是内部专用 API, 可能会在未来发行版中删除
1、使用公开 API:
尽量使用 Java 提供的标准 API,特别是关于网络和 IP 地址的功能,java.net.InetAddress 类就是一个合适的替代选择。
修改前:
import sun.net.util.IPAddressUtil;
// 校验ipv6
(IPAddressUtil.isIPv6LiteralAddress(split[0])
修改后:
import java.net.InetAddress;public static boolean isIPv6LiteralAddress(String ipAddress) {try {InetAddress inetAddress = InetAddress.getByName(ipAddress);return inetAddress instanceof java.net.Inet6Address;} catch (UnknownHostException e) {// 地址无效return false;}
}
// 使用此方法校验ipv6
isIPv6LiteralAddress(split[0]))
三、has been relocated to
[WARNING] The artifact mysql:mysql-connector-java:jar:8.0.31 has been relocated to com.mysql:mysql-connector-j:jar:8.0.31
The artifact org.hibernate:hibernate-validator:jar:6.0.8.Final has been relocated to org.hibernate.validator:hibernate-validator:jar:6.0.8.Final
1、警告表明一些 Maven 依赖项已经被重定向到新的坐标。需要在 pom.xml 文件中更新相关的依赖项。
修改前:
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.31</version>
</dependency>
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>6.0.8.Final</version>
</dependency>
修改后:
<dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><version>8.0.31</version>
</dependency>
<dependency><groupId>org.hibernate.validator</groupId><artifactId>hibernate-validator</artifactId><version>6.0.8.Final</version>
</dependency>
四、sun.security.util.DerValue
[WARNING] CertUtil.java:[7,25] sun.security.util.DerValue是内部专用 API, 可能会在未来发行版中删除
1、sun.security.util.DerInputStream 是一个内部专用 API,通常不推荐直接使用,因为它可能在不同的 Java 版本中发生变化,导致兼容性问题。
2、使用 Bouncy Castle 解析 DER 数据,避免使用内部 API。
修改前:
public PrivateKey getPrivateKey(String privateKeyFilePath) {try {File privateKeyFile = new File(privateKeyFilePath);Path path = Paths.get(privateKeyFile.getAbsolutePath());String privateKeyPem = new String(Files.readAllBytes(path));privateKeyPem = privateKeyPem.replace(PEM_RSA_PRIVATE_START, "").replace(PEM_RSA_PRIVATE_END, "");privateKeyPem = privateKeyPem.replaceAll("\\s", "");DerInputStream derReader = new DerInputStream(Base64.getDecoder().decode(privateKeyPem));DerValue[] seq = derReader.getSequence(0);if (seq.length < 9) {throw new GeneralSecurityException("Could not parse a PKCS1 private key.");}// skip version seq[0];BigInteger modulus = seq[1].getBigInteger();BigInteger publicExp = seq[2].getBigInteger();BigInteger privateExp = seq[3].getBigInteger();BigInteger prime1 = seq[4].getBigInteger();BigInteger prime2 = seq[5].getBigInteger();BigInteger exp1 = seq[6].getBigInteger();BigInteger exp2 = seq[7].getBigInteger();BigInteger crtCoef = seq[8].getBigInteger();RSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp, prime1, prime2, exp1, exp2, crtCoef);KeyFactory factory = KeyFactory.getInstance("RSA");return factory.generatePrivate(keySpec);} catch (Exception e) {log.error(e.getMessage());return null;}}
修改后:
static {// 注册 Bouncy Castle 提供者Security.addProvider(new BouncyCastleProvider());}public PrivateKey getPrivateKey(String privateKeyFilePath) {try {File privateKeyFile = new File(privateKeyFilePath);Path path = Paths.get(privateKeyFile.getAbsolutePath());String privateKeyPem = new String(Files.readAllBytes(path));privateKeyPem = privateKeyPem.replace(PEM_RSA_PRIVATE_START, "").replace(PEM_RSA_PRIVATE_END, "");privateKeyPem = privateKeyPem.replaceAll("\\s", "");// 解析 DER 格式的私钥byte[] derBytes = Base64.getDecoder().decode(privateKeyPem);RSAPrivateKey rsaPrivateKey = RSAPrivateKey.getInstance(derBytes);// 获取 RSA 私钥的参数BigInteger modulus = rsaPrivateKey.getModulus();BigInteger publicExp = rsaPrivateKey.getPublicExponent();BigInteger privateExp = rsaPrivateKey.getPrivateExponent();BigInteger prime1 = rsaPrivateKey.getPrime1();BigInteger prime2 = rsaPrivateKey.getPrime2();BigInteger exp1 = rsaPrivateKey.getExponent1();BigInteger exp2 = rsaPrivateKey.getExponent2();BigInteger crtCoef = rsaPrivateKey.getCoefficient();// 创建 RSAPrivateKeySpecRSAPrivateCrtKeySpec keySpec = new RSAPrivateCrtKeySpec(modulus, publicExp, privateExp, prime1, prime2, exp1, exp2, crtCoef);KeyFactory factory = KeyFactory.getInstance("RSA");return factory.generatePrivate(keySpec);} catch (Exception e) {log.error(e.getMessage());return null;}}