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();
// 创建 RSAPrivateKeySpec
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;
}
}