如何将文件夹添加到java构建路径作为库,具有多个jar或条目? [英] How to add a folder to java build path as library, having multiple jars or entries in it?

查看:151
本文介绍了如何将文件夹添加到java构建路径作为库,具有多个jar或条目?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

首先,我要非常感谢丰富的卖家,以编程方式解决我在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.

我想将我的库文件夹添加到java构建路径,其中有几个jar。它应该像一个类路径容器。
我尝试使用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。

推荐答案

你应该定义一个新的ClasspathContainer通过实现 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());
}

这篇关于如何将文件夹添加到java构建路径作为库,具有多个jar或条目?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆