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

Reply via email to