jEdit Python Shell 插件无法 运行 Python3(如何更新 .jar 存档中的文件?)

jEdit Python Shell plugin fails to run Python3 (How to update a file in a .jar archive?)

让我很疑惑的是,jEdit的PythonShell插件怎么不能和Python3一起使用呢?这个问题似乎自 2012 年以来就为人所知,显然还没有人提供该插件的更新版本 ( http://www.jedit.org/oldtrackers/Plugin%20Feature%20Requests/3498547.html ),适用于 Python2.x 和 Python3.x 。 只有我一个人需要在 jEdit 中将此插件设置为 运行 吗?

问题在于此插件使用了 Python3 中不可用的 execfile() 函数。为了提供修复,有必要替换此插件的 PythonShell.java 代码:

    execfile("filename")

    exec( open("filename").read() )

对于不太熟悉 Java 的我来说,很难从调整后的 PyhonShell.java 文件中获得更新的 PythonShell.jar。 解决问题成功后,我仍然不明白的是如何使用jar。经过许多不同的方法,我终于得出了:

    jar -u PythonShell.jar -C python/shell  PythonShell.class

但这也给了我和我一直得到的一样的东西:

     jar: `-u' mode requires a file name

jar 的 -help 无法帮助我理解我在尝试用从编译的 [=36] 中获得的新版本替换 PythonShell.jar 中的 PythonShell.class 文件时做错了什么=] 文件。

我的解决方法是将 .jar 重命名为 .zip,使用文件管理器将 PythonShell.class 文件放入其中,然后将其重命名回 .jar,但我很乐意摆脱不理解 'jar' 命令如何工作的直觉不好。

默认情况下,jar 命令在流模式下工作。这意味着如果您执行 jar -c foo,它会使用文件 foo 从中创建一个 JAR 并将其输出到标准输出。然后您可以将其重定向到一个文件 (jar -c foo >foo.jar),或者您可以使用 -f 指示 jar 创建一个文件 (jar -cf foo.jar foo).

这同样适用于更新 JAR 文件,您可以像 cat foo.jar | jar -u foo >foo2.jar 一样将输入和输出流式传输,或者您可以使用 -f 指示它就地更新文件,例如jar -uf foo.jar foo.

如果您告诉它使用 -u 更新文件,但您没有指定要使用 -f 更新哪个文件并且没有在 stdin 上提供任何内容,那么它无法正常工作不知道要更新什么文件。

PS:欢迎您提交补丁到https://sourceforge.net/p/jedit/plugin-patches插件维护者接受,或者如果没有活跃的维护者而您想超越插件的维护。

直击我问题的核心,事实证明我的尝试和我的 之前直观的理解如何更新一个Java jar archive:

XXX jar -u PythonShell.jar -C python/shell  PythonShell.class XXX

是一个纯粹的生活胡说八道的案例......这是我新获得的理解

应该怎么做:

jar -uf PythonShell.jar python/shell/PythonShell.class

为了能够以这种方式做到这一点,重新创建 正确的目录以形成文件所需的路径 PythonShell.class 。当前目录真正重要的命令案例。这仍然不是可能的情况,但至少我的直觉不好,我已经走到了死胡同 路径现在消失了。

这是我进行的练习,以测试我对 jar 命令有效:

让我们在目录 [foo] 中创建一个名为 'bar' 的文件,其中包含文本 "bar"

~ $ mkdir foo
~ $ echo bar > foo/bar

让我们将文件 'bar' 放入 jar 存档 'foo.jar' 目录 [foo] 文件 'bar' 存储在:

~ $ jar -c foo/bar > foo.jar

让我们看一下 "in",在 'foo.jar' jar-archive 文件中:

~ $ cat foo.jar | jar -t
META-INF/
META-INF/MANIFEST.MF
foo/bar

让我们删除目录 [foo] 并提取 jar 存档以重新获取目录和其中的文件。然后看看文件内容是什么 'bar':

~ $ mv foo foo-old-1  
~ $ cat foo.jar | jar -x
~ $ cat foo/bar
bar

好的 - 到目前为止一切如预期?

现在准备更新文件 'bar' 中的必要内容 带有补丁 'bar' 文件的 jar-archive 现在包含文本 "foo":

~ $ echo foo > foo/bar

此处 CORRECT 语法用于更新存储在目录 [foo] 中的 jar 归档文件 'bar'。对我来说,在这种情况下,文件路径 'bar' 的指定方式对发生的事情有很大影响,这让我感到惊讶:

~ $ jar -uf foo.jar foo/bar

让我们检查一下是否成功:

~ $ mv foo foo-old-2
~ $ cat foo.jar | jar -x
~ $ cat foo/bar
foo

好的 - 这就是我所期望的。我自己认为这是一个好兆头,表明我现在做对了。