Статьи

Используйте Eclipse JDT для динамического создания, доступа и загрузки проектов

В этой статье мы собираемся использовать Eclipse JDT для создания, доступа и загрузки проектов. Я предполагаю, что вы знаете, как создать простой проект подключаемого модуля Eclipse, который добавляет элемент меню, по которому вы можете щелкнуть и вызвать некоторые действия. Если вы не знаете, вы можете перейти к этой статье . Причина, по которой нам нужен проект подключаемого модуля, заключается в том, что Java-модель работает только внутри подключаемого модуля, а отдельное приложение не будет поддерживать Java-модель.

Эта статья посвящена только JDT Java Model. Будут исследованы следующие три темы:

  • Создавайте проекты в рабочей области
  • Доступ к проектам в рабочей области
  • Динамический импорт существующих проектов в рабочую область

Это очень важно, когда вы хотите обработать большое количество Java-проектов.

1. Создавайте проекты

Мы можем использовать Java Model для создания нового проекта в рабочей области.

Следующее здесь требует следующих зависимостей:

import org.eclipse.core.resources.IFolder;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.IProjectDescription;
import org.eclipse.core.resources.IWorkspaceRoot;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.jdt.core.IClasspathEntry;
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.launching.JavaRuntime;

Добавьте код для запуска метода. Код игнорирует операторы try / catch, Eclipse попросит вас добавить код обработки исключений.

// create a project with name "TESTJDT"
IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
IProject project = root.getProject("TESTJDT");
project.create(null);
project.open(null);
 
//set the Java nature
IProjectDescription description = project.getDescription();
description.setNatureIds(new String[] { JavaCore.NATURE_ID });
 
//create the project
project.setDescription(description, null);
IJavaProject javaProject = JavaCore.create(project);
 
//set the build path
IClasspathEntry[] buildPath = {
		JavaCore.newSourceEntry(project.getFullPath().append("src")),
				JavaRuntime.getDefaultJREContainerEntry() };
 
javaProject.setRawClasspath(buildPath, project.getFullPath().append(
				"bin"), null);
 
//create folder by using resources package
IFolder folder = project.getFolder("src");
folder.create(true, true, null);
 
//Add folder to Java element
IPackageFragmentRoot srcFolder = javaProject
				.getPackageFragmentRoot(folder);
 
//create package fragment
IPackageFragment fragment = srcFolder.createPackageFragment(
		"com.programcreek", true, null);
 
//init code string and create compilation unit
String str = "package com.programcreek;" + "\n"
	+ "public class Test  {" + "\n" + " private String name;"
	+ "\n" + "}";
 
		ICompilationUnit cu = fragment.createCompilationUnit("Test.java", str,
				false, null);
 
//create a field
IType type = cu.getType("Test");
 
type.createField("private String age;", null, true, null);

Когда вы запустите действие, будет создан следующий проект.

2. Доступ к проектам

Если в нашем рабочем пространстве уже есть проекты, мы можем использовать Java Model для циклического прохождения каждого из них.

	public void run(IAction action) {
		// Get the root of the workspace
		IWorkspace workspace = ResourcesPlugin.getWorkspace();
		IWorkspaceRoot root = workspace.getRoot();
		// Get all projects in the workspace
		IProject[] projects = root.getProjects();
		// Loop over all projects
		for (IProject project : projects) {
			System.out.println(project.getName());
		}
 
	}

Если мы импортируем несколько проектов или создаем их и щелкаем созданный нами элемент меню, имена проектов отображаются следующим образом.

3. Динамически загружать / импортировать существующие проекты в рабочую область

На предыдущем шаге нам нужно вручную импортировать существующие проекты в рабочее пространство. Если число больше, это не будет применимо.

Eclipse JDT предоставляет функции для этого динамически. Теперь давайте посмотрим, как импортировать большое количество существующих проектов в рабочее пространство. Он не копирует файлы в корневой каталог рабочей области, а только указывает на проекты во внешнем каталоге. В этом примере я использую флэш-диск для хранения своих проектов с открытым исходным кодом. Таким образом, вы можете анализировать тысячи проектов и получать нужную информацию, не копируя ничего.

IWorkspaceRoot root= ResourcesPlugin.getWorkspace().getRoot();
 
final IWorkspace workspace = ResourcesPlugin.getWorkspace();
 
System.out.println("root" + root.getLocation().toOSString());
 
Runnable runnable = new Runnable() {
	public void run() {
		try {
			IPath projectDotProjectFile = new Path("/media/flashx/TestProjectImport" + "/.project");
			IProjectDescription projectDescription = workspace.loadProjectDescription(projectDotProjectFile);
			IProject project = workspace.getRoot().getProject(projectDescription.getName());
			JavaCapabilityConfigurationPage.createProject(project, projectDescription.getLocationURI(),	null);
			//project.create(null);
		} catch (CoreException e) {
			e.printStackTrace();
		}
	}
};
 
// and now get the workbench to do the work
final IWorkbench workbench = PlatformUI.getWorkbench();
workbench.getDisplay().syncExec(runnable);
 
 
IProject[] projects = root.getProjects();
 
for(IProject project: projects){
	System.out.println(project.getName());
}

Что если проект, который мы хотим загрузить, не содержит файл .project? Это сложный случай, нам нужно динамически создавать все эти проекты, используя его исходный код.

Заметки

При выполнении приведенных выше примеров вы можете получить сообщение об ошибке типа «Тип org.eclipse.core.runtime.IAdaptable не может быть разрешен. На него косвенно ссылаются необходимые файлы .class ». Решением является добавление org.eclipse.core.runtime через редактор подключаемых модулей. Простое добавление к пути сборки не будет работать.

Если вы считаете эту статью полезной и хотите узнать больше, вы можете перейти к серии Eclipse JDT Tutorial Series, которую я написал.