我想知道是否有办法告诉JVM它无法连接到某个Java程序的任何Web资源,或者在执行此操作时立即失败,即执行相当于关闭Internet访问的软件硬件开关.这是为了协助自动测试,禁用系统的防火墙对我来说是没有选择的.
背景: 我目前正在研究一个Java问题,其中XML标识转换不适用于XML中引用的DOCTYPE,如下所示:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="32px"
height="32px" viewBox="0 0 32 32" enable-background="new 0 0 32 32" xml:space="preserve">
<!-- content.... -->
</svg>
Run Code Online (Sandbox Code Playgroud)
DocumentBuilderFactory,TransformerFactory等的标准行为是访问Web以查找缺失的实体.虽然修复建议/sf/answers/657902171/(NullEntityResolver)解决了我的大多数问题,但我想在"离线环境"中以自动方式测试此功能以进行回归.
我最近发现了如何使用本地GraphicsEnvironment st注册TTF字体,对于我的用例(SVG-to-PNG转码),Apache Batik可能会识别字体:
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.GraphicsEnvironment;
// [...]
GraphicsEnvironment lge = GraphicsEnvironment.getLocalGraphicsEnvironment();
try {
Font font = Font.createFont(Font.TRUETYPE_FONT, fontFile);
lge.registerFont(font);
} catch (FontFormatException e) {
logger.warn(e.getMessage(), e);
} catch (IOException e) {
logger.warn(e.getMessage(), e);
}
Run Code Online (Sandbox Code Playgroud)
但是,我想知道是否可以取消注册任何预先存在的字体,以保证只有我注册的字体才会用于转码.
没有GraphicsEnvironment #unregisterFont(...),我怎么能实现这个呢?
PS:我不想继承GraphicsEnvironment的子类,因为我不能假设存在任何特定的子类,如sun.awt.Win32GraphicsEnvironment.
编辑: 更多信息: