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




