Jython - 在Java项目中使用Pygments

1 投票
1 回答
1418 浏览
提问于 2025-04-16 07:47

我正在尝试在Java项目中使用Pygments,方法是包含Jython.jar。在我的Java项目中,我有一个src/main/python的源代码目录,我把Pygments的文件放在了一个名为pygments的文件夹里,这样它们就能被找到并使用了。现在我在src/main/python中创建了一个名为highlighter.py的文件,内容如下:

import sys
sys.path.append('WEB-INF/classes')
from pygments import highlight
from pygments.lexers import get_lexer_by_name
from pygments.formatters import HtmlFormatter

class Highlighter:
    def colorize(code, lexername):
        lexer = get_lexer_by_name(lexername, stripall=True)
        formatter = HtmlFormatter(linenos=True, cssclass="source")
        return highlight(code, lexer, formatter)

接着,我定义了一个Java接口Highlighter.java

public interface Highlighter {
    String colorize(String rawText, String lexer);
}

最后,我创建了一个工厂类,使用PythonInterpreter来把highlighter.py作为一个Jython对象暴露出来,具体的做法可以参考这里

现在,当我运行这行代码时

Highlighter hl = (Highlighter) jf.getJythonObject(Highlighter.class.getName(), 
       "WEB-INF/classes/highlighter.py");

我遇到了一个PyException,内容如下

Traceback (most recent call last):
File "WEB-INF/classes/highlighter.py", line 3, in 
  from pygments import highlight
LookupError: no codec search functions registered: can't find encoding

这个问题发生在我使用Jython版本2.5.0时。在2.1版本中,我需要把Jython/Lib目录复制到src/main/python下,但那样我又缺少了IOString模块。

或者说,可能有更好的方法来实现我想要的功能?我很好奇是否有人能够在Java项目中成功使用Pygments。如果有任何建议,我将非常感激。

1 个回答

1

好的,我搞定了。虽然犯了一些初学者的错误,但如果你想知道如何在你的Java项目中使用Pygments,这里有一个完整的教程链接

重点总结:

  • 单独使用jython.jar是不够的。
  • 把Jython/Lib添加到你的类路径中是行不通的。我最后是把jython.jar解压,然后把Lib目录和所有Pygments文件添加到解压后的结构中,再重新打包成jar文件。
  • 上面链接中的工厂示例有点复杂。更好的方法是参考Jython书籍中的第10章
  • 关于修改后的highlighter.py、Highlighter.java和HighlighterFactory.java的示例,可以查看教程。

撰写回答