1

我正在尝试运行无头 Eclipse 构建,但我被卡住了。我的上下文是我想使用 PyDev 代码分析而不必启动 eclipse gui。我知道其他用于进行代码分析的命令行工具(pyflakes、pylint 等)。

到目前为止我的命令是:

java -jar /path/to/eclipse/plugins/org.eclipse.equinox.launcher_1.2.0.v20110502.jar -noSplash -data "/path/to/workspace" -application org.eclipse.jdt.apt.core.aptBuild

我的java版本是1.6.0_31,我的eclipse版本是3.7.2,我的pydev版本是2.5.0。

当我运行该命令时,它看起来正在运行,但它从未捕获任何错误或警告。

...
PyDev: Analyzing 29 of 33 (forms.py)
PyDev: Analyzing 29 of 33 (forms.py)
PyDev: Analyzing 29 of 33 (forms.py)
PyDev: Analyzing 29 of 33 (forms.py)
...

如果 I tail -f /path/to/workspace/.metadata/.log,我会得到一个巨大的堆栈跟踪:

!ENTRY org.eclipse.equinox.preferences 4 2 2012-07-30 17:48:39.612
!MESSAGE Problems occurred when invoking code from plug-in: "org.eclipse.equinox.preferences".
!STACK 0
java.lang.ExceptionInInitializerError
    at org.eclipse.debug.internal.ui.DebugUIPreferenceInitializer.setDefault(DebugUIPreferenceInitializer.java:186)
    at org.eclipse.debug.internal.ui.DebugUIPreferenceInitializer.setThemeBasedPreferences(DebugUIPreferenceInitializer.java:204)
    at org.eclipse.debug.internal.ui.DebugUIPreferenceInitializer.initializeDefaultPreferences(DebugUIPreferenceInitializer.java:79)
    at org.eclipse.core.internal.preferences.PreferenceServiceRegistryHelper$1.run(PreferenceServiceRegistryHelper.java:281)
..... TRUNCATED ......

!ENTRY org.eclipse.osgi 4 0 2012-07-30 17:48:39.622
!MESSAGE An error occurred while automatically activating bundle org.eclipse.debug.ui (42).
!STACK 0
org.osgi.framework.BundleException: Exception in org.eclipse.debug.internal.ui.DebugUIPlugin.start() of bundle org.eclipse.debug.ui.
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:734)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)
    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299)
..... TRUNCATED .......

java.lang.IllegalStateException: Workbench has not been created yet.
    at org.eclipse.ui.PlatformUI.getWorkbench(PlatformUI.java:92)
    at org.eclipse.debug.internal.ui.contextlaunching.LaunchingResourceManager.startup(LaunchingResourceManager.java:546)
    at org.eclipse.debug.internal.ui.DebugUIPlugin.getLaunchingResourceManager(DebugUIPlugin.java:315)
    at org.eclipse.debug.internal.ui.DebugUIPlugin.start(DebugUIPlugin.java:516)
..... TRUNCATED ......

!ENTRY org.eclipse.osgi 4 0 2012-07-30 17:48:39.624
!MESSAGE An error occurred while automatically activating bundle org.eclipse.debug.core (41).
!STACK 0
org.osgi.framework.BundleException: Exception in org.eclipse.debug.core.DebugPlugin.start() of bundle org.eclipse.debug.core.
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.startActivator(BundleContextImpl.java:734)
    at org.eclipse.osgi.framework.internal.core.BundleContextImpl.start(BundleContextImpl.java:683)
    at org.eclipse.osgi.framework.internal.core.BundleHost.startWorker(BundleHost.java:381)
    at org.eclipse.osgi.framework.internal.core.AbstractBundle.start(AbstractBundle.java:299)
..... TRUNCATED ......

我怀疑 PyDev 需要 gui 来呈现错误/警告。

4

1 回答 1

2

PyDev 需要 gui 来呈现错误/警告,通常它没有在命令行中使用......现在,话虽如此,它确实具有运行代码分析而不需要 gui 的单元测试(也甚至加载了eclipse),但是您必须在内存中配置解释器/项目才能使其工作。

看:

https://github.com/aptana/Pydev/blob/development/plugins/com.python.pydev.analysis/tests/com/python/pydev/analysis/OccurrencesAnalyzerTest.java

https://github.com/aptana/Pydev/blob/development/plugins/com.python.pydev.analysis/tests/com/python/pydev/analysis/AnalysisTestsBase.java

对于不需要加载 Eclipse 工作台的代码分析测试(即:甚至不需要无头运行 Eclipse——它可以作为一个简单的 Java 程序运行,但你仍然必须执行 Java main([]) 在 CLASSPATH 中使用 PyDev 并使用其 API 正确设置 PyDev 中使用的解释器以及项目/pythonpath)。

您可以查看测试的设置(即:不要忘记查看超类,例如 CodeCompletionTestsBase/AnalysisTestsBase)。

注意:如果您确实创建了这样的 main([]),请为 PyDev 提供补丁,因为它可能会被其他人使用...

作为实现说明,这样的 main 可能应该从正在启动的 shell 收集所有当前 PYTHONPATH 条目并在解释器中配置所有这些条目......此外,它可能应该接收一个目录作为参数,以便它分析所有文件树(启动可能会花费你大部分时间来配置东西,所以,理想情况下,你可以从一次运行中分析尽可能多的文件,因为 PyDev 代码分析是为了在启动中缓存很多东西然后使用 RAM 中的信息——或者创建一个始终存在的服务器进程?)。

于 2012-08-03T16:21:55.730 回答