2010-12-01 21 views
7

Wie kann ich einen neuen Erstellungspfadeintrag für eine * .jar-Datei erstellen und diesen Klassenpfadeintrag zum Erstellungspfad eines Eclipse-Projekts hinzufügen?Programmgesteuertes Hinzufügen einer Bibliothek zu einem Eclipse-Projekt

Ich habe ein Plugin, das mein Zielprojekt automatisch einrichten sollte. Daher benötigt dieses Projekt einige Bibliotheksimporte, und ich möchte diese Importe automatisch mit einem Assistenten hinzufügen. Der Benutzer wählt nur den Speicherort eines bestimmten SDK aus, und dann müssen einige Bibliotheken mit dem Zielprojekt verknüpft werden.

Allerdings fand ich einige Hinweise:

Importing libraries in Eclipse programmatically

How to add a folder to java build path as library, having multiple jars or entries in it?

Leider habe ich es versäumt, die zweite Lösung zu implementieren, da ich nicht die Klassen IClasspathContainer, Javacore und IJavaProject finden.

Ich benutze Eclipse Helios und JDK. Benötige ich zusätzliche Bibliotheken, um Änderungen am Build-Pfad vorzunehmen, oder gibt es eine einfachere Lösung zum programmgesteuerten Importieren einer JAR-Bibliothek?

Grüße, Florian

Antwort

1

Ich gehe davon aus, dass Sie ein Plugin erstellen und benötigen eine Plugin die zusätzlichen Gläser zu dem Classpath hinzugefügt zu verwalten.

Wie Sie bereits erwähnt haben, müssen Sie einen benutzerdefinierten Klassenpfadcontainer erstellen. Erstellen Sie zunächst die Classpath Container Erweiterung von exending diesen Erweiterungspunkt:

org.eclipse.jdt.core.classpathContainerInitializer 

Dann Sie eine Klasse erstellen, die org.eclipse.jdt.core.IClasspathContainer und verbinden sie mit dem Erweiterungspunkt implementiert soeben erstellt wurde.

Sie erwähnen, dass Sie die org.eclipse.jdt.core.IClasspathContainer-Schnittstelle nicht finden können. Sie müssen sicherstellen, dass Ihr Plugin auf das org.eclipse.jdt.core-Plugin in seiner MANIFEST.MF verweist.

+0

Ich habe vergessen, die Java Developer Tools zu integrieren, nachdem ich sie heruntergeladen habe. Nachdem ich das behoben hatte, benutzte ich das Tutorial aboth, um einen benutzerdefinierten Klassencontainer zu erstellen. – Florian

1

Here können Sie einige Beispiele finden, wie neue Klassenpfadeinträge und Klassenpfadcontainer für Java-Projekte definiert werden. Ich denke, es wäre praktisch für jemanden, der diese Frage liest.

0

Um Zugriff auf IJavaProject usw. zu erhalten, rufen Sie Ihre plugin.xml auf und fügen Sie org.eclipse.jdt.core dem Klassenpfad hinzu. Danach können Sie diese Pakete in Ihr Projekt importieren.

0
String projectName = "MyProject"; // project to add a library to 
IProject project = ResourcesPlugin.getWorkspace().getRoot().getProject(projectName); 
IJavaProject jProject = JavaCore.create(project); 

for(File file : new File("path-to-some-directory-of-libraries-to-add").listFiles()){ 
    if(file.isFile() && file.getName().endsWith(".jar")){ 
     addProjectLibrary(jProject, file); 
    } 
} 

private static void addProjectLibrary(IJavaProject jProject, File jarLibrary) throws IOException, URISyntaxException, MalformedURLException, CoreException { 
    // copy the jar file into the project 
    InputStream jarLibraryInputStream = new BufferedInputStream(new FileInputStream(jarLibrary)); 
    IFile libFile = jProject.getProject().getFile(jarLibrary.getName()); 
    libFile.create(jarLibraryInputStream, false, null); 

    // create a classpath entry for the library 
    IClasspathEntry relativeLibraryEntry = new org.eclipse.jdt.internal.core.ClasspathEntry(
     IPackageFragmentRoot.K_BINARY, 
     IClasspathEntry.CPE_LIBRARY, libFile.getLocation(), 
     ClasspathEntry.INCLUDE_ALL, // inclusion patterns 
     ClasspathEntry.EXCLUDE_NONE, // exclusion patterns 
     null, null, null, // specific output folder 
     false, // exported 
     ClasspathEntry.NO_ACCESS_RULES, false, // no access rules to combine 
     ClasspathEntry.NO_EXTRA_ATTRIBUTES); 

    // add the new classpath entry to the project's existing entries 
    IClasspathEntry[] oldEntries = jProject.getRawClasspath(); 
    IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length + 1]; 
    System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length); 
    newEntries[oldEntries.length] = relativeLibraryEntry; 
    jProject.setRawClasspath(newEntries, null); 
} 

Beachten Sie, dass als Andrew Eisenberg erwähnt, müssen Sie die org.eclipse.jdt.core Plugin Abhängigkeit in Ihrem Plugins MANIFEST.MF enthalten.

Beachten Sie, dass Sie möglicherweise auch programmatically refresh the project benötigen.

Verwandte Themen