2010-12-01 6 views
7

Comment puis-je créer une nouvelle entrée de chemin de génération pour un fichier * .jar et ajouter cette entrée de chemin de classe au chemin de construction d'un projet Eclipse.Ajout par programme d'une bibliothèque à un projet Eclipse

J'ai un plugin qui devrait automatiquement configurer mon projet cible. Donc ce projet doit avoir des importations de bibliothèque et je veux ajouter ces imports automatiquement en utilisant un assistant. L'utilisateur sélectionne simplement l'emplacement d'un certain SDK et certaines bibliothèques doivent être liées au projet cible.

Cependant, j'ai trouvé quelques références:

Importing libraries in Eclipse programmatically

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

Malheureusement, je ne ai pas mettre en œuvre la deuxième solution que je ne peux pas trouver les classes IClasspathContainer, javacore et IJavaProject. J'utilise Eclipse Helios et JDK. J'utilise Eclipse Helios et JDK. Ai-je besoin de bibliothèques supplémentaires pour apporter des modifications au chemin de construction ou existe-t-il une solution plus simple pour importer une bibliothèque jar par programme?

Cordialement, Florian

Répondre

1

Je suppose que vous créez un plug-in et ont besoin de votre plugin pour gérer les pots supplémentaires ajoutés au classpath.

Comme vous l'avez mentionné, vous devez créer un conteneur de chemin de classe personnalisé. Tout d'abord, créer l'extension de conteneur classpath par exending ce point d'extension:

org.eclipse.jdt.core.classpathContainerInitializer 

Ensuite, vous créez une classe qui implémente org.eclipse.jdt.core.IClasspathContainer et de l'associer avec le point d'extension que vous venez de créer.

Vous mentionnez que vous ne pouvez pas trouver l'interface org.eclipse.jdt.core.IClasspathContainer. Vous devez vous assurer que votre plugin fait référence au plugin org.eclipse.jdt.core dans son MANIFEST.MF.

+0

J'ai oublié d'inclure les outils de développement Java après les avoir téléchargés. Après avoir corrigé cela, j'ai utilisé le tutoriel aboth pour créer un conteneur de classe personnalisé. – Florian

1

Here Vous pouvez trouver quelques exemples, comment définir de nouvelles entrées de chemin de classe et des conteneurs de chemin de classe vers des projets Java. Je pense que ce serait utile pour quelqu'un qui lit cette question.

0

Afin d'avoir accès à IJavaProject etc, allez dans votre fichier plugin.xml et ajoutez org.eclipse.jdt.core au classpath. Vous pouvez ensuite importer ces packages dans votre projet.

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); 
} 

Notez que comme Andrew Eisenberg mentionné, vous devez inclure la dépendance du plugin org.eclipse.jdt.core dans MANIFEST.MF de votre plugin.

Notez que vous pouvez aussi avoir besoin de programmatically refresh the project.

Questions connexes