GitHub user jaikiran opened a pull request: https://github.com/apache/ant/pull/69
Allow more control over JUnit libraries and Ant runtime libraries for users of junitlauncher I've been sitting on these changes for a while now trying to complete this work and then get some inputs. But I think these changes have now reached a state where I can get some feedback for them. **Background** 1.10.3 of Ant introduced support for using JUnit 5 through the new `junitlauncher` task. The support was minimal but had enough features for users to get started with using JUnit 5. JUnit 5 project divides the JUnit libraries into `platform`, `launcher` and `engine` libraries. Ant's `junitlauncher` task relies only on JUnit `platform` and `launcher` libraries to support launching the tests. The `engine` libraries are allowed to be part of the task's classpath (configured via the `classpath` element). Unlike for the `engine` libraries, the `junitlauncher` task requires the JUnit `platform` and `launcher` libraries to be part of the Ant runtime classpath (either in the Ant installation directories or by using the `-lib` option while launching Ant). Historically, as seen with `junit` task, users prefer more control over the location of these jars while running their tests. **Goal** The goal of the commit(s) in this PR is to allow users to configure a classpath for the `junitlauncher` task with the necessary `platform`, `launcher` JUnit libraries and not force them to place these jars in the Ant runtime classpath. Imagine something like: ``` <path id="test.classpath"> <pathelement location="${build.classes.dir}" /> <!-- JUnit platform and launcher jars --> <fileset dir="${basedir}/lib/junit-platform/" includes="*.jar"/> <!-- JUnit engine jars --> <fileset dir="${basedir}/lib/junit-jupiter/" includes="*.jar"/> <fileset dir="${basedir}/lib/junit-vintage/" includes="*.jar"/> </path> <target name="test"> <junitlauncher> <testclasses outputdir="${output.dir}"> <fileset dir="${build.classes.dir}"/> </testclasses> <classpath refid="test.classpath" /> </junitlauncher> </target> ``` and then just run the build as: ``` ant test ``` without any explicit `-lib` nor the necessity to place the JUnit libraries in the Ant installation directory. **Overview of changes** Changes in this PR borrow ideas from the `junit` task and at the same time try and keep the complexity of this task manageable. This PR has 2 commits. One is solely in the build file and can be discussed/reviewed separately. I'll explain the build changes later in this PR. The main change in this PR is the commit which refactors the existing code. What that commit does is separates out the classes that are part of the `junitlauncher` task into 2 separate packages. The `org.apache.tools.ant.taskdefs.optional.junitlauncher.confined` package as noted in its `package-info.java` documentation is _not_ allowed to have any _compile_ time dependency on the classes in `org.apache.tools.ant.taskdefs.optional.junitlauncher` or any of the classes in JUnit libraries. This allows the implementation of the task to load the JUnit libraries or any classes that depend on those libraries in a way that those classes don't have to be on the runtime classpath of Ant when the build is launched (see `TaskConfiguredPathClassLoader` in this PR and its usage for details). On the other hand, the classes in the `org.apache.tools.ant.taskdefs.optional.junitlauncher` are allowed to have compile time dependency on classes in `org.apache.tools.ant.taskdefs.optional.junitlauncher.confined` or any classes that belong to JUnit libraries. Most the "core" logic of launching the tests happens in this package. The commits in this PR are only refactoring changes to get this working. These do not contain any logic changes to the currently supported features of junitlauncher task. Although these refactoring changes do touch some classes/code that's meant to deal with `fork` mode support, none of these changes have any impact on the current functionality of how `fork` mode is implemented. In fact, the classloading changes that are described and implemented here play no role, if the `junitlauncher` task is configured to use `fork` mode. **Backward compatibility** One unfortunate but unavoidable change that I had to do was move the `JUnitLauncherTask` class (among some others) from `org.apache.tools.ant.taskdefs.optional.junitlauncher` to `org.apache.tools.ant.taskdefs.optional.junitlauncher.confined` package. This effectively means that if there was anyone out there who were relying on this class (out side of the task usage in the build file itself) will start running into issue. I need input on this part (among other things in this PR) - are we allowed to do such changes and add a backward compatiblity note in our release notes? **Build file change** The commit in this PR which deals with the build file, updates the `build` task to add a `verification` check (to be extra careful) to ensure that the classes in the `org.apache.tools.ant.taskdefs.optional.junitlauncher.confined` package have no compile time dependency on JUnit libraries or even classes in `org.apache.tools.ant.taskdefs.optional.junitlauncher` package. I couldn't think of a better approach to add this kind of check. I'm open to suggestions if this doesn't look right. If these changes look good, I'll go ahead and start working on updating this task's manual. You can merge this pull request into a Git repository by running: $ git pull https://github.com/jaikiran/ant junit5-fork-classpath Alternatively you can review and apply these changes as the patch at: https://github.com/apache/ant/pull/69.patch To close this pull request, make a commit to your master/trunk branch with (at least) the following in the commit message: This closes #69 ---- commit 2bf001994ce5019a5a3b86e455a54e46b5b60ca3 Author: Jaikiran Pai <jaikiran@...> Date: 2018-08-29T09:56:38Z [junitlauncher] Allow JUnit libraries to be part of the task's classpath instead of mandating it to be part of Ant's runtime classpath commit 64e38efc22331362625b6fcb7af438973fe83c1c Author: Jaikiran Pai <jaikiran@...> Date: 2018-10-11T09:49:55Z [junitlauncher] Add a check in the build to ensure that the junitlauncher classes in "confined" package do not depend on classes they aren't meant to ---- --- --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@ant.apache.org For additional commands, e-mail: dev-h...@ant.apache.org