2016-06-12 89 views
3

我有一个Eclipse的Java项目,并希望得到像项目源目录,类路径等信息。我目前的实施解析.project文件。但是由于我没有找到描述.project文件结构的官方文档,我对这种方法的稳健性有一些担忧。是否可以在无头模式下使用JDT加载Eclipse项目?

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

虽然JDT的开发者指南说

JDT核心包让你访问Java模型对象和无头的Java IDE的基础设施。

所有我能找到打开例子现有的Java项目得到项目IJavaProject对象workspace内或使用IProject对象。但我无法找到将项目添加到workspace或构建从路径到.project文件的IProject/IJavaProject的方式。

任何人都可以请帮忙吗?

回答

0

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

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

相反,我会建议你转移到Maven。这是一个更多的工作,但允许您使用整个maven基础架构和API来完成任务。你想在这里实现,可能已经可以使用Maven插件。

+0

感谢。但ant4eclipse似乎没有导出可直接在Java项目中使用的API。 如果已经有库可以读取相应的配置和工具以将Eclipse项目转换为Maven或Gradle项目,那么切换到Maven或Gradle可能是一个可行的选择。 – MYP

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-

+0

获取'Workspace'和'JavaCore'是有用的,但是我的问题实际上是获取/构造调用'getResolvedClasspath'所需的'IJavaProject'对象。 – MYP

+0

仔细观察这两个班级。一个会给你一个IProject,另一个可以使用它来给你相应的IJavaProject。 – nitind

+0

你的意思是'JavaCore.create(IProject)'方法吗?它需要一个'IProject'参数,而'IProject'的唯一实现者,即'Project',有一个'protected'构造函数。 'WorkspaceRoot.getProject(String)'返回一个'Project',但我需要一个'Workspace'来获得一个'WorkspaceRoot'。在无头设置中,调用'ResourcePlugin.getWorkspace()'直接触发异常'java.lang.IllegalStateException:工作空间已关闭,因为'ResourcePlugin.workspace'未初始化。要初始化它,必须用'BundleContext'调用'ResourcePlugin.start'。 ...我错过了什么? – MYP

相关问题