【问题标题】:Java binary compatibility issue: sun.font.FontManager class became interfaceJava 二进制兼容性问题:sun.font.FontManager 类成为接口
【发布时间】:2012-03-04 00:28:20
【问题描述】:

我正在使用 Lobo - Java Web Browser 库,它给了我一个例外,经过一些研究,我确定这可能是由于该库已针对旧版本的 Java 编译。

代码如下:

import java.io.IOException;
import org.lobobrowser.html.UserAgentContext;
import org.lobobrowser.html.parser.DocumentBuilderImpl;
import org.lobobrowser.html.parser.InputSourceImpl;
import org.lobobrowser.html.test.SimpleUserAgentContext;
import org.xml.sax.SAXException;

public class Cobratest
{
    public static void main(String[] args) throws SAXException, IOException
    {
        UserAgentContext uAgent = new SimpleUserAgentContext();
        DocumentBuilderImpl docBuild = new DocumentBuilderImpl(uAgent);
        docBuild.parse(new InputSourceImpl("http://dic.amdz.com/"));
    }
}

堆栈跟踪是:

 Exception in thread "main" java.lang.IncompatibleClassChangeError: Found interface sun.font.FontManager, but class was expected
    at org.lobobrowser.util.gui.FontFactory.createFont(FontFactory.java:210)
    at org.lobobrowser.util.gui.FontFactory.createFont_Impl(FontFactory.java:180)
    at org.lobobrowser.util.gui.FontFactory.createFont(FontFactory.java:127)
    at org.lobobrowser.util.gui.FontFactory.getFont(FontFactory.java:98)
    at org.lobobrowser.html.style.StyleSheetRenderState.<clinit>(StyleSheetRenderState.java:43)
    at org.lobobrowser.html.domimpl.NodeImpl.<clinit>(NodeImpl.java:39)
    at org.lobobrowser.html.parser.DocumentBuilderImpl.createDocument(DocumentBuilderImpl.java:143)
    at org.lobobrowser.html.parser.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:97)

当我检查org.lobobrowser.util.gui.FontFactory.createFont 时,我发现有一个名为FontManager 的接口与以前的Java 版本不同。在这个FontFactory 类中,他们使用了该接口的一个类,该类不再可用。我该如何解决这个问题?

接口FontManager

package sun.font;

import java.awt.Font;
import java.awt.FontFormatException;
import java.io.File;

public interface FontManager {

    public static final int NO_FALLBACK = 0;
    public static final int PHYSICAL_FALLBACK = 1;
    public static final int LOGICAL_FALLBACK = 2;

    public boolean registerFont(Font font);

    public void deRegisterBadFont(Font2D font2d);

    public Font2D findFont2D(String string, int i, int i1);

    public Font2D createFont2D(File file, int i, boolean bln, CreatedFontTracker cft) throws FontFormatException;

    public boolean usingPerAppContextComposites();

    public Font2DHandle getNewComposite(String string, int i, Font2DHandle fdh);

    public void preferLocaleFonts();

    public void preferProportionalFonts();
}

以及库中使用的类不可用:

   return FontManager.getCompositeFontUIResource(new Font(name, style, size));

【问题讨论】:

  • stackoverflow.com/questions/2863043/… 的可能重复项。 sun.*com.sun.* 是内部软件包,如有更改,恕不另行通知。 “com.sun.xml.internal 包顾名思义就是一个内部包,用户不要编写依赖于JDK内部实现类的代码。此类类是JDK内部实现细节,如有更改,恕不另行通知”
  • @MikeSamuel 所以你是在告诉我我注定要失败?
  • 我怀疑您使用的库取决于特定 JVM 版本的内部细节。可能有办法解决这个问题,但我不知道。我会与库开发人员核实,看看他们是否意识到了这个问题——他们可能已经有了修复或计划。
  • “有一种情况” 用你的 shift 键?如果不是,请在每个句子的开头应用一次,用于单词 I 和任何专有名称。如果是这样,修复它。尝试阅读这种“喃喃自语”是很痛苦的。
  • @AndrewThompson 你所说的情况和换档键是什么意思?没听懂:(

标签: java interface binary-compatibility


【解决方案1】:

我认为 'sun.font.FontManager' 已被 Java7 删除,所以如果你必须使用它(我建议不要使用它并寻找另一个包),你可以尝试使用 java6 运行它。

【讨论】:

  • 问起来可能很便宜,但从来没有遇到过这种情况,我搜索过你所说的并下载了 jre6,但现在我不知道如何重新编译旧的 .jar 文件。还是我应该用 java 6 继续整个事情?在任何这些情况下,它怎么可能?我的意思是如何使用带有 java 6 的 IDE?谢谢:)
  • 我的建议是使用 JDK6 运行编译和应用程序 - 不要重新编译旧的 jar 文件。我不知道它是否会起作用,但可能值得一试。
【解决方案2】:

LoboBrowser 项目已被 LoboEvolution 取代,但有一个 patchmentioned 用于过时的 LoboBrowser 实现。

更新FontFactory.java以导入公共方法并修改createFont方法如下:

import static javax.swing.text.StyleContext.*;

private Font createFont(String name, int style, int size) {
  return getDefaultStyleContext().getFont(name, style, size);
}

【讨论】:

  • 无法下载链接的jar,但可以在手动编译和替换ticket中提到的类(并从Mozilla获取Rhino JS引擎)后让lobo工作。 CSV 源似乎是最新的。
【解决方案3】:

javax.swing.text.StyleContext.getDefaultStyleContext.getFont 可能适用于您,跨 JDK 版本。

进一步查看http://elliotth.blogspot.com.au/2007/04/far-east-asian-fonts-with-java-7-on.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-11
    相关资源
    最近更新 更多