You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java项目可正常运行但无法构建JAR:缺失saaj包及文件转字节数组方案咨询

解决JAR构建失败:com.sun.xml.internal.messaging.saaj.packaging.mime.util不存在的问题

这个坑我之前踩过!核心原因是你用了com.sun.xml.internal.messaging.saaj.packaging.mime.util.ASCIIUtility这个Sun/Oracle的内部API——这类API不属于Java标准库的公开范畴,本地运行时JVM可能放宽了限制,但打包JAR时会因为访问权限校验失败报错。下面给你两种靠谱的解决方案:

方案一:替换为公开的SAJ依赖库

原来的内部类属于SAJ(SOAP with Attachments API for Java)的私有实现,你可以引入官方公开的SAJ依赖包,替换掉内部API的引用:

Maven依赖配置

<dependency>
    <groupId>com.sun.xml.messaging.saaj</groupId>
    <artifactId>saaj-impl</artifactId>
    <version>1.5.3</version> <!-- 建议使用最新稳定版 -->
</dependency>

修改导入语句

把原来的内部API导入改成公开版本(去掉internal关键字):

import static com.sun.xml.messaging.saaj.packaging.mime.util.ASCIIUtility.getBytes;

这样就能正常调用getBytes(iStream),打包JAR也不会报错了。

方案二:改用标准JDK或通用工具类(更推荐)

其实读取文件字节数组根本不需要依赖SAJ的工具类,用JDK自带的API或者通用工具类更稳妥,还能避免依赖特定库:

方法1:Java 7+ 标准API(最省心)

直接用Files.readAllBytes,连InputStream都不用手动创建:

import java.nio.file.Files;
import java.nio.file.Paths;

// 替换你原来的两行代码
byte[] bytesFile = Files.readAllBytes(Paths.get(filePath));

这是Java标准库的方法,兼容性拉满,没有任何额外依赖。

方法2:自定义InputStream转字节数组方法

如果需要处理非文件的InputStream(比如网络流),可以自己实现一个简单的工具方法:

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public static byte[] getBytes(InputStream inputStream) throws IOException {
    ByteArrayOutputStream buffer = new ByteArrayOutputStream();
    byte[] temp = new byte[1024];
    int len;
    while ((len = inputStream.read(temp)) != -1) {
        buffer.write(temp, 0, len);
    }
    return buffer.toByteArray();
}

然后直接调用这个方法即可,完全不需要外部依赖。

方法3:使用Apache Commons IO工具类

如果你项目里已经在用Apache Commons库,可以直接用IOUtils

<!-- Maven依赖 -->
<dependency>
    <groupId>commons-io</groupId>
    <artifactId>commons-io</artifactId>
    <version>2.15.1</version>
</dependency>

调用代码:

import org.apache.commons.io.IOUtils;

byte[] bytesFile = IOUtils.toByteArray(iStream);

总结

优先推荐方案二的方法1,用JDK标准API最稳妥,没有依赖问题;如果必须保留InputStream的处理逻辑,可以选自定义方法或者Apache Commons IO。

内容的提问来源于stack exchange,提问作者Giancarlo Benítez

火山引擎 最新活动