You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@maven.apache.org by Lasse Koskela <la...@gmail.com> on 2007/05/23 06:37:36 UTC

Access to the full classpath when running under Surefire (WAS: [Maven 2])

Oops. Sorry about the ambiguous title in my previous post... I changed
it to something more communicative.

Lasse

On 5/23/07, Lasse Koskela <la...@gmail.com> wrote:
> Hi,
>
> I'm trying to convert the open source JUnit extension called JspTest
> to use Maven2 for the build and I'm running into trouble with how
> Maven's Surefire test runner plugin seems to "hide" the classpath from
> the executing code.
>
> The issue stems from the need for a unit test to be able to compile
> Java source code (generated from JSP source files), which obviously
> needs all sorts of J2EE stuff in the classpath. These dependencies
> have been defined in the pom.xml and are visible just fine when
> compiling the framework itself and when running the tests, but when
> those tests (indirectly) attempt to use the same dependencies to build
> up a classpath for a new "javac" process I get all kinds of
> "symbol/package/class not found" compilation errors because
> System.getProperty("java.class.path") returns only some
> maven/surefire/plexus libraries and not a single dependency (not even
> the "target/classes" or "target/test-classes" directories).
>
> If I were talking about a plugin, I could have the dependencies be
> injected to the Mojo through properties but I'm not talking about a
> plugin so that's not an option.
>
> So, I guess my question is how can I get access to the Maven
> dependencies and/or the full classpath?
>
>
> best regards,
> Lasse

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org


Re: Access to the full classpath when running under Surefire (WAS: [Maven 2])

Posted by James Abley <ja...@gmail.com>.
On 23/05/07, Lasse Koskela <la...@gmail.com> wrote:
>
> Oops. Sorry about the ambiguous title in my previous post... I changed
> it to something more communicative.
>
> Lasse
>
> On 5/23/07, Lasse Koskela <la...@gmail.com> wrote:
> > Hi,
> >
> > I'm trying to convert the open source JUnit extension called JspTest
> > to use Maven2 for the build and I'm running into trouble with how
> > Maven's Surefire test runner plugin seems to "hide" the classpath from
> > the executing code.
> >
> > The issue stems from the need for a unit test to be able to compile
> > Java source code (generated from JSP source files), which obviously
> > needs all sorts of J2EE stuff in the classpath. These dependencies
> > have been defined in the pom.xml and are visible just fine when
> > compiling the framework itself and when running the tests, but when
> > those tests (indirectly) attempt to use the same dependencies to build
> > up a classpath for a new "javac" process I get all kinds of
> > "symbol/package/class not found" compilation errors because
> > System.getProperty("java.class.path") returns only some
> > maven/surefire/plexus libraries and not a single dependency (not even
> > the "target/classes" or "target/test-classes" directories).
> >
> > If I were talking about a plugin, I could have the dependencies be
> > injected to the Mojo through properties but I'm not talking about a
> > plugin so that's not an option.
> >
> > So, I guess my question is how can I get access to the Maven
> > dependencies and/or the full classpath?
> >


Hi Lasse,

I was hoping to see an answer to this since I had a similar issue. I have a
class that executes processes. I wanted to write tests for this class, to
ensure that it does what I think it does, and make various assertions about
the exit status and stdout / stderr of the process being tested.

Within Eclipse, the System property java.class.path works well, but not in
maven2. So I resorted to manually constructing the classpath myself. Not
ideal, but I didn't see a system property or similar with the full test
classpath available.

    public class ClasspathBuilder {

        /**
         * Path to maven repository.
         */
        private final String mavenRepository;

        /**
         * Classpath being constructed.
         */
        private StringBuffer classpath;

        /**
         * The base directory used to build a new entry.
         */
        private String basedir;

        /**
         * Create a new ClasspathBuilder.
         *
         */
        public ClasspathBuilder() {
            mavenRepository = joinPaths(joinPaths(System
                    .getProperty("user.home"), ".m2"), "repository");
            basedir = mavenRepository;
            classpath = new StringBuffer(".");
        }

        /**
         * Set the base directory.
         *
         * @param files
         *            an array of files consituting the base directory
         */
        public void setBaseDir(String[] files) {
            StringBuffer buf = new StringBuffer(files[0]);

            for (int i = 1, n = files.length; i < n; ++i) {
                buf.append(joinPaths(buf.toString(), files[i]));
            }
            basedir = buf.toString();
        }

        /**
         * Create a new Entry.
         *
         * @param files
         *            string array of file names, which will be the
directories
         *            in the path below the $MAVEN_HOME/repository
         */
        public void addEntry(String[] files) {
            StringBuffer entry = new StringBuffer();
            entry.append(basedir);
            for (int i = 0, n = files.length; i < n; ++i) {
                entry.append(File.separatorChar);
                entry.append(files[i]);
            }
            classpath.append(File.pathSeparatorChar);
            classpath.append(entry.toString());
        }

        /**
         * Join the paths.
         *
         * @param root
         *            the root path.
         * @param file
         *            the file / directory to append.
         * @return return the newly extended path
         */
        private String joinPaths(String root, String file) {
            StringBuffer buf = new StringBuffer(root);
            buf.append(File.separatorChar);
            buf.append(file);
            return buf.toString();
        }

        /**
         * Return the constructed classpath.
         *
         * @return the classpath
         */
        public String getClasspath() {
            return classpath.toString();
        }

        /**
         * {@inheritDoc}
         */
        public String toString() {
            return getClasspath();
        }

    }


and using it like this:

        /*
         * This only works within the IDE - at least within Eclipse
         */
        // return System.getProperty("java.class.path");
        ClasspathBuilder builder = new ClasspathBuilder();
        builder.addEntry(new String[] { "commons-io", "commons-io", "1.3.1",
                "commons-io-1.3.1.jar" });
        builder.addEntry(new String[] { "commons-lang", "commons-lang", "2.0
",
                "commons-lang-2.0.jar" });
        builder.addEntry(new String[] { "log4j", "log4j", "1.2.8",
                "log4j-1.2.8.jar" });

        builder.setBaseDir(new String[] { System.getProperty("user.dir") });
        builder.addEntry(new String[] { "my-module", "target",
                "test-classes" });
        builder.addEntry(new String[] { "target", "test-classes" });
        return builder.getClasspath();


Not ideal, but it's not giving me any pain thus far. Obviously, when
dependency versions change, I have a minor maintenance issue, but it works
for me currently.

Cheers,

James

>
> > best regards,
> > Lasse
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
> For additional commands, e-mail: users-help@maven.apache.org
>
>