如何将文件夹作为库添加到 java 构建路径,其中包含多个 jar 或条目?

2022-01-16 00:00:00 eclipse-plugin eclipse

首先我要非常感谢有钱的卖家"解决了我关于以编程方式更改 eclipse java 构建路径中的输入顺序的查询.

First I want to say lots of thanks to "Rich seller" to solving my query for changing the entry order in eclipse java build path programatically.

我想将我的库文件夹添加到其中包含多个 jar 的 java 构建路径.它应该表现得像一个类路径容器.我尝试使用 IClasspathContainer 但未能实现.

I want to add my Library folder to java build path which has several jars in it. It should behave like a classpath container. I tried with IClasspathContainer but failed to implement.

请帮帮我....

提前致谢.

YUVRAJ.

推荐答案

你应该通过实现 org.eclipse.jdt.core.classpath.ContainerInitializerextension 点.例如 org.eclipse.jdt.junit 插件在其 plugin.xml 中定义了以下内容

You should define a new ClasspathContainer by implementing the org.eclipse.jdt.core.classpath.ContainerInitializerextension point. For example the org.eclipse.jdt.junit plugin defines the following in its plugin.xml

<extension
  point="org.eclipse.jdt.core.classpathContainerInitializer">
  <classpathContainerInitializer
        class="org.eclipse.jdt.internal.junit.buildpath.JUnitContainerInitializer"
        id="org.eclipse.jdt.junit.JUNIT_CONTAINER">
  </classpathContainerInitializer>
</extension>

引用的 JUnitContainerInitializer 创建并初始化两个 JUnit 类路径容器.

The referenced JUnitContainerInitializer creates and initialises the two JUnit classpath containers.

按照这种方法,您可以实现文件夹容器".有一个 DeveloperWorks 文章,展示了如何执行此操作(您需要注册才能查看文章).

Following this approach you can implement a "folder container". There is a DeveloperWorks article that shows how to do this (you'll need to register to view the article).

更新:可以在不注册扩展点的情况下定义容器,但您必须注意,如果文件夹的内容发生更改,您将无法访问生命周期方法来刷新容器.最好通过扩展点来做.

Update: It is possible to define a container without registering the extension point, but you have to be aware that you'll not have access to lifecycle methods to refresh the container if the contents of the folder change. It is much better to do it via the extension point.

下面的示例会将项目的lib"文件夹添加为自定义容器,并将在该文件夹中找到的任何 jar 文件添加为容器中的条目.它不管理源关联.

The example below will add the "lib" folder of a project as a custom container, and add any jar files found in the folder as entries within the container. It does not manage source associations .

final String description = "My container";

IProject project = ResourcesPlugin.getWorkspace().getRoot()
        .getProject("foo");

//get the lib folder, TODO check if it exists!
final IFolder folder = project.getFolder("lib");

//define a unique path for the custom container
final IPath containerPath = new Path(
        "my.custom.CLASSPATH_CONTAINER").append(project
        .getFullPath());

IJavaProject javaProject = JavaCore.create(project);

//create a container that lists all jars in the lib folder
IClasspathContainer customContainer = new IClasspathContainer() {
    public IClasspathEntry[] getClasspathEntries() {
        List<IClasspathEntry> entryList = new ArrayList<IClasspathEntry>();
        try {
            // add any members that are files with the jar extension
            IResource[] members = folder.members();
            for (IResource resource : members) {
                if (IFile.class.isAssignableFrom(resource
                        .getClass())) {
                    if (resource.getName().endsWith(".jar")) {
                        entryList.add(JavaCore.newLibraryEntry(
                                new Path(resource.getFullPath()
                                        .toOSString()), null,
                                new Path("/")));
                    }
                }
            }
        } catch (CoreException e) {
            // TODO handle the exception
            e.printStackTrace();
        }
        // convert the list to an array and return it
        IClasspathEntry[] entryArray = new IClasspathEntry[entryList
                .size()];
        return entryList.toArray(entryArray);
    }

    public String getDescription() {
        return description;
    }

    public int getKind() {
        return IClasspathEntry.CPE_CONTAINER;
    }

    public IPath getPath() {
        return containerPath;
    }

    @Override
    public String toString() {
        return getDescription();
    }
};

//register the custom container so when we add its path it is discovered
JavaCore.setClasspathContainer(containerPath,
        new IJavaProject[] { javaProject },
        new IClasspathContainer[] { customContainer }, null);

IClasspathEntry[] entries = javaProject.getRawClasspath();

//check if the container is already on the path
boolean hasCustomContainer = false;

for (int i = 0; i < entries.length; i++) {
    if (entries[i].getEntryKind() == IClasspathEntry.CPE_CONTAINER
            && entries[i].getPath().equals(containerPath)) {
        hasCustomContainer = true;
    }
}
if (!hasCustomContainer) {
    IClasspathEntry[] newEntries = new IClasspathEntry[entries.length + 1];

    System.arraycopy(entries, 0, newEntries, 0, entries.length);

    // add a new entry using the path to the container
    newEntries[entries.length] = JavaCore
            .newContainerEntry(customContainer.getPath());

    javaProject.setRawClasspath(newEntries,
            new NullProgressMonitor());
}

相关文章