2010-12-01 23 views
7

¿Cómo puedo crear una nueva entrada de ruta de compilación para cualquier archivo * .jar y agregar esta entrada classpath a la ruta de compilación de un proyecto de Eclipse.Agregar una biblioteca mediante programación a un proyecto de Eclipse

Tengo un complemento que debe configurar automáticamente mi proyecto de destino. Por lo tanto, este proyecto necesita tener algunas importaciones de biblioteca y quiero agregar esto a las importaciones de forma automática mediante un asistente. El usuario simplemente selecciona la ubicación de un determinado SDK y luego algunas bibliotecas deben vincularse con el proyecto de destino.

Sin embargo, he encontrado algunas referencias:

Importing libraries in Eclipse programmatically

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

Por desgracia, no pude poner en práctica la segunda solución, ya que no puedo encontrar las clases IClasspathContainer, javacore y IJavaProject.

Estoy usando Eclipse Helios y JDK. ¿Necesito alguna biblioteca adicional para realizar cambios en la ruta de compilación o existe una solución más simple para importar una biblioteca de jar programáticamente?

Saludos, Florian

Respuesta

1

Estoy asumiendo que va a crear un plugin y necesitan su plugin para gestionar los frascos extra añadido a la ruta de clase.

Como mencionas, necesitas crear un contenedor personalizado de classpath. En primer lugar, crear la extensión de ruta de clases de contenedores por exending este punto de extensión:

org.eclipse.jdt.core.classpathContainerInitializer 

A continuación, se crea una clase que implementa org.eclipse.jdt.core.IClasspathContainer y asociarlo con el punto de extensión que acaba de crear.

Mencione que no puede encontrar la interfaz org.eclipse.jdt.core.IClasspathContainer. Debe asegurarse de que su complemento haga referencia al complemento org.eclipse.jdt.core en MANIFEST.MF.

+0

Olvidé incluir las Herramientas de desarrollo de Java después de que las descargué. Una vez reparado, utilicé el tutorial aboth para crear un contenedor de clase personalizado. – Florian

1

Here puede encontrar algunos ejemplos, cómo definir nuevas entradas de classpath y classpath contenedores para proyectos java. Creo que sería útil para alguien que lea esta pregunta.

0

Para obtener acceso a IJavaProject, etc., vaya a su plugin.xml y agregue org.eclipse.jdt.core al classpath. A partir de entonces puede importar esos paquetes en su proyecto.

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

Tenga en cuenta que como se mencionó Andrew Eisenberg, es necesario incluir la dependencia org.eclipse.jdt.core plug-in en MANIFIEST.MF de su plugin.

Tenga en cuenta que también puede necesitar programmatically refresh the project también.

Cuestiones relacionadas