【问题标题】:Is it possible to load an eclipse Java project using JDT in the headless mode?是否可以在无头模式下使用 JDT 加载 Eclipse Java 项目?
【发布时间】:2016-06-14 09:17:05
【问题描述】:

我有一个 Eclipse Java 项目,想要获取项目源目录、类路径等信息。我当前的实现解析 .project 文件。但由于我没有找到任何描述.project 文件结构的官方文档,我对这种方法的稳健性有些担忧。

更方便、更健壮的方法是使用 JDT(无头)加载项目并从 IJavaProject 对象获取相关信息。

虽然JDT的开发者指南说

JDT Core 包让您可以访问 Java 模型对象和无头 Java IDE 基础架构。

我可以找到打开现有 Java 项目的所有示例从 workspace 内的项目中获取 IJavaProject 对象或使用 IProject 对象。但我找不到将项目添加到workspace 或从.project 文件的路径构造IProject/IJavaProject 的方法。

有人可以帮忙吗?

【问题讨论】:

    标签: java eclipse eclipse-jdt headless


    【解决方案1】:

    是的,并且都可以通过清晰稳定的 API 来完成。 org.eclipse.jdt.core 是一个插件,就像 org.eclipse.core.resources 一样(您可以在其中获得 IWorkspace 实例) ,并且他们都希望 Eclipse 运行时 中运行,如果你用这种方式编写Eclipse 应用程序,它可能是无头的。 JDT 使用.classpath 文件来记录源、库和构建输出在哪里,以及对要使用的库的抽象引用,而.project 文件则记录它一般是什么类型的项目--Java、PHP ,Web,这些或其他的一些组合 - 以及有关要执行哪些构建器的更多信息。

    所以让你自己成为一个无头的 Eclipse 应用程序,或者将你的最终目标功能打包到一个里面。

    https://wiki.eclipse.org/FAQ_What_is_an_Eclipse_application%3F https://wiki.eclipse.org/FAQ_What_are_extensions_and_extension_points%3F http://help.eclipse.org/mars/topic/org.eclipse.platform.doc.isv/reference/extension-points/org_eclipse_core_runtime_applications.html?cp=2_1_1_27

    http://help.eclipse.org/mars/topic/org.eclipse.platform.doc.isv/reference/api/org/eclipse/core/resources/ResourcesPlugin.html#getWorkspace-- http://help.eclipse.org/mars/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/JavaCore.html#getJavaCore-- http://help.eclipse.org/mars/topic/org.eclipse.jdt.doc.isv/reference/api/org/eclipse/jdt/core/IJavaProject.html#getResolvedClasspath-boolean-

    【讨论】:

    • 获取WorkspaceJavaCore 很有用,但我的问题实际上是获取/构造IJavaProject 对象,这是调用getResolvedClasspath 所必需的。
    • 好好看看这两个类。一个会给你一个 IProject,另一个可以用它给你相应的 IJavaProject。
    • 您的意思是JavaCore.create(IProject) 方法吗?它需要一个IProject 参数,而IProject 的唯一实现者,即Project,有一个protected 构造函数。 WorkspaceRoot.getProject(String) 返回一个Project,但我需要一个Workspace 才能获得WorkspaceRoot。在无头设置中,调用ResourcePlugin.getWorkspace() 直接触发异常java.lang.IllegalStateException: Workspace is closed,因为ResourcePlugin.workspace 未初始化。要初始化它,必须使用BundleContext 调用ResourcePlugin.start。 ...我错过了什么吗?
    • 或者您能否提供一个简短的示例来说明这是如何完成的?那太好了。
    • 您无需创建具体实例,而是从 ResourcesPlugin 为您提供的工作区中获取它们。实现是内部的,所以暂时忽略它们;您不会自己创建实例。所有相关方法都返回带有公共接口的对象,这足以将您链接在一起并将您带到您想去的地方。所以对于JavaCore 需要的IProject,从 ResourcesPlugin 给你的IWorkspace 获取它。是的,你错过了我说它必须在 Eclipse 应用程序中运行才能工作的部分。
    【解决方案2】:

    有关允许您在 Eclipse 项目中工作的项目,请参阅 http://www.ant4eclipse.org/

    几年前我使用了它,发现它对于长期使用和构建脚本来说太脆弱了。我建议不要依赖内部 Eclipse 的东西。他们打破!通常在混合版本时。

    相反,我建议您迁移到 Maven。这需要更多的工作,但允许您使用整个 Maven 基础设施和 API 来做事。您想在这里实现的目标,可能已经使用 Maven 插件实现了。

    【讨论】:

    • 谢谢。但是ant4eclipse好像没有导出一个可以在Java项目中直接使用的API。如果已经有库可以读取相应的配置和工具以将 Eclipse 项目转换为 Maven 或 Gradle 项目,那么切换到 Maven 或 Gradle 可能是一个可行的选择。
    猜你喜欢
    • 2013-03-24
    • 1970-01-01
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    相关资源
    最近更新 更多