Search code examples
eclipseeclipse-plugineclipse-jdt

Using Eclipse's JDT, how do I identify the classpath for a project?


I am writing a plug-in that will generate unit tests for a Java class that is selected in Eclipse's Project Explorer. This plug-in uses a third-party program called Randoop to generate the tests, so I make this happen using ProcessBuilder:

ProcessBuilder builder = new ProcessBuilder(command);

where the command that is passed to the ProcessBuilder is a list of Strings, something like

["java", "-classpath", "path1;path2;etc", "randoop.main.Main", ...]

Within the plug-in I am trying to generate the classpath for Randoop based on the classpath that Eclipse knows about. Here is some of what I have so far:

IClasspathEntry[] resolvedClasspath = javaProject.getResolvedClasspath(true);

for (IClasspathEntry entry : resolvedClasspath) {
    if (entry.getEntryKind() == IClasspathEntry.CPE_SOURCE) {
        IPath outputLocation = entry.getOutputLocation();

        if (outputLocation != null) {
            buf.append(outputLocation.toString());
        }
        else {
            buf.append(entry.getPath().toString());
        }
    }
    else {
        buf.append(entry.getPath().toString());
    }
    buf.append(CLASSPATH_SEP);
}

It isn't quite right. It seems to specify the library jar files okay, but doesn't do so well with identifying the paths to class files corresponding to CPE_SOURCE entries. For example, I see a classpath entry of /myPkgFragRoot/src/main/java instead of myPkgFragRoot/target/classes.

I seem to have a muddled picture of how Eclipse treats classpaths, so I'm looking for some help. Firstly, I'm wondering if my high-level approach is wrong. It seems like I am writing a large amount of code to generate an incorrect classpath. Is there some simpler way of getting a classpath from an IJavaProject than getting the results of getResolvedClasspath and iterating through them and manipulating the individual entries? Secondly, if there isn't a simpler way, how should I be locating the class files produced by building the project?


Solution

  • If the outputLocation is null, you have to use the default output location javaProject.getOutputLocation() instead of entry.getPath().

    See Javadoc of IClasspathEntry.getOutputLocation():

    Returns:

    the full path [...], or null if using default output folder

    If in Project > Properties: Java Build Path tab Source the check box Allow output folders for source folders is not checked, IClasspathEntry::getOutputLocation() will always return null.