JEP 238: Multi-Version JAR Files
David M. Lloyd
david.lloyd at redhat.com
Wed Feb 25 18:42:08 UTC 2015
On 02/25/2015 11:41 AM, Paul Sandoz wrote:
>
> On Feb 25, 2015, at 5:27 PM, Brian Goetz <brian.goetz at Oracle.COM> wrote:
>
>>
>>
>> On 2/12/2015 5:59 PM, Stephen Colebourne wrote:
>>> Interesting direction.
>>>
>>> Reading carefully, the goal is actually very limited in scope, by
>>> preventing any public API changes. It doesn't help adoption of JSR-310
>>> for example, but will be useful for Unsafe, which is clearly a
>>> motivating factor.
>>>
>>> I would expect IDEs to have some considerable work to do.
>>
>> Agree on the "work" part, but I doubt it is "considerable".
>>
>> For creating MV JARs, the 'jar' tool does all the heavy lifting.
>>
>> For running Java apps, the classloader does all the heavy lifting.
>>
>> For tools that have to consume JARs, the JarFile API does all the heavy lifting. If you use JarFile, it's a one-line change to the constructor to get a version-specific view of the JAR.
>>
>> So in each of these cases, the work is limited to:
>> - Figure out how you intend to interact with MVJars;
>> - Configure the appropriate tool (jar tool, JarFile) appropriately; this is generally a matter of new constructor arguments and/or new command line arguments.
>>
>> So I totally agree there will be lots of things that change, but those changes should be individually quite small (and this is consistent with our experience supporting MVJars in the JDK tools.)
>>
>
> In the design doc i outlined how to explicitly compile an mv-style project.
>
> How hard would it be to hack up a new kind of maven project layout and javac compilation task that did something similar?
>
> Does anybody with maven expertise know more?
I've done a little bit of work on the maven-compiler-plugin internals
and its plexus buddies, and overall I don't think this would necessarily
be a massive undertaking, though it might have to be, depending on some
factors:
1) If the JDK-agnostic sources are required to be fully self-contained
(i.e. no "outward" dependencies on JDK-specific code), it would be
trivial to compile the JDK-agnostic code first, then the JDK-specific
code which references the other code as dependencies. However this
arrangement is practically quite useless for the average developer who
is doing this just so they could have just one JDK-specific version of
some class used by their main code.
2) In the more likely case that the -specific and -agnostic code is
interdependent, it gets trickier because the compiler task would have to
(I guess) compile the code N times, once for each JDK, while also
correlating the -specific files and discarding the redundant -agnostic
files (leaving aside weirdness that may occur if the files actually
*differ* due to constant expansion weirdness and so on). This thought
leaves me feeling not so great - it seems like there are many subtle
ways it could fail.
3) The best scenario however is that JavaCompiler will magically do all
this work for us, figuring out (for example) the constant stuff and
other potential weirdness, and then organizing the resultant .class
files in their appropriate places based on some input
configuration/cooperation with the JavaFileManager for the task. In
this case I'd imagine that the maven-compiler-plugin would work as
today, with just a few extra switches to point out the JDK-specific
source directories, and Maven would be blissfully ignorant of any other
considerations.
--
- DML
More information about the core-libs-dev
mailing list