To be clear, I was purely addressing the concern of a Multi-Release JAR. Cheers, Paul
On Wed, Aug 31, 2016 at 10:09 AM, Richard Sand <[email protected]> wrote: > I definitely concur with Robert's point: "I don't think we make developers > very happy if they are advised to have a multimodule project just to be > able to compile the module-info file.". I can live with the requirement > that I must run Maven with Java9 to support creating module-info and having > the addtional modules created by a separate plugin. Simplicity wherever > possible. > > Best regards, > > Richard Sand | CEO > IDF Connect, Inc. > 2207 Concord Ave, #359 > Wilmington | Delaware 19803 | USA > Office: +1 888 765 1611 | Fax: +1 866 765 7284 > Mobile: +1 267 984 3651 > > > ------ Original Message ------ > From: "Robert Scholte" <[email protected]> > To: "ZML-Apache-Maven-Developers" <[email protected]>; "Paul Benedict" > <[email protected]> > Sent: 8/31/2016 10:39:52 AM > Subject: Re: Building jar targeting multiple Java versions, including 9 > > Hi Paul, >> >> no problem to move it to this thread. It is indeed about "The Maven >> Way", although we may need to start from the beginning, explaining the >> issue we're facing. >> >> Let's use ASM as an example, their 6.0_ALPHA has been built like this, >> although without Maven. >> ASM is an all purpose Java bytecode manipulation and analysis framework. >> IIRC their code is compatible with Java 1.2, but they've also added a >> module-info for those who want to use this dependency within a >> Java9/Jigsaw project. >> module-info MUST be built with Java9 with source/target or release = 9. >> Other sources must be built with an older JDK with source/target 1.2 >> >> There are several ways to solve this: >> - multi-module project and multi release jar like Paul suggest. However, >> IIRC the specs say that the module-info MUST exist in the root. >> - 2 source folders, src/main/java and src/main/jigsaw, both writing to >> target/classes. Here it is quite clear what happens per source-folder. >> - 1 source folder and all the magic of calling javac twice in the >> maven-compiler-plugin. I started with this, but I don't like it. Details >> are below. >> - 1 source folder and 2 execution blocks (one excluding module-info, one >> only including module-info). >> >> We shouldn't be looking at Maven alone, but also at IDE support. AFAIK >> Netbeans and IntelliJ simply call Maven. Eclipse is probably hard due to >> the m2eclipse extensions. >> >> Now back to Pauls suggestion. I don't think we make developers very >> happy if they are advised to have a multimodule project just to be able >> to compile the module-info file. >> I am aware that this is mainly an issue for library builders, end users >> simply build everything with Java9, no problems there. From library >> builders you can expect that they don't mind adding extra configuration to >> build their jar, but forcing them to set up a Maven multimodule project is >> not really nice. >> I would expect the module-info close to the related sourcefiles, so I >> would prefer in the same (single) MavenProject. >> >> *Unless* IDEs are so strong with handling multi release jars that it >> looks like I'm adjusting the module-info, even though it is actually >> located somewhere else. >> >> So let's see the opinions from others. >> >> thanks, >> Robert >> >> On Wed, 31 Aug 2016 15:59:04 +0200, Paul Benedict <[email protected]> >> wrote: >> >> Robert, I'm responding to dev@maven so we can discuss Maven >>> philosophies... >>> >>> I believe the pattern should be based on a multi-module project. Each >>> module should target the expected JDK version. Then introduce a new >>> "mrjar" >>> type for the parent that knows how to bind them all together into a >>> Multi-Release JAR. >>> >>> Cheers, >>> Paul >>> >>> On Wed, Aug 31, 2016 at 6:10 AM, Robert Scholte <[email protected]> >>> wrote: >>> >>> I've been working on the implementation of this in the >>>> maven-compiler-plugin, but I'm not really pleased with the result. >>>> The problem is that in the worst case scenario we have to work with 3 >>>> different versions of Java: >>>> - The Maven Runtime (set as JAVA_HOME) >>>> - JDK for the module-info.java >>>> - JDK for all other source files. >>>> >>>> The example below worked because all three were set to JDK9. >>>> But based on the source/target of 1.6 I cannot predict which JDK is >>>> used, >>>> only that it is at least JDK6. Should the plugin switch to another JDK? >>>> And if you want to compile with source/target 1.5 or less, you're in >>>> trouble. There's something called toolchain, where you can specify the >>>> JavaHome per version, but in case of maven-compiler-plugin it assumes >>>> that >>>> all java-related plugins and execution blocks want to use the same >>>> toolchain through the whole Maven project. >>>> The good news is that for the maven-jdeps-plugin I improved this part in >>>> Maven 3.3.1, since this plugin only works with Java8 and above, which >>>> doesn't have to be the same JDK to compile the sources with. Now you can >>>> simple say: I want the toolchain for version X. This feature needs to be >>>> added to the plugin. >>>> >>>> That said I think I will write a recipe for this. This is first of all >>>> an >>>> issue for library writers who want to have their jar compatible with >>>> multiple Java versions for their end users. >>>> Result: One javac call per execution block as it was meant to be. >>>> >>>> thanks, >>>> Robert >>>> >>>> On Fri, 26 Aug 2016 15:31:07 +0200, Oliver Gondža <[email protected]> >>>> wrote: >>>> >>>> Thank you all for your suggestions. I managed to get the project to >>>> build >>>> >>>>> with following maven setup: >>>>> >>>>> ``` >>>>> <!-- >>>>> When using compiler from java 8 and older, ignore module files >>>>> altogether. >>>>> Otherwise, use 2 phase compilation to build >>>>> - all classes for target version and >>>>> - module-info.java with 9+ source and target level >>>>> --> >>>>> <build> >>>>> <plugins> >>>>> <plugin> >>>>> <groupId>org.apache.maven.plugins</groupId> >>>>> <artifactId>maven-compiler-plugin</artifactId> >>>>> <version>3.5.1</version> >>>>> <configuration> >>>>> <source>1.6</source> >>>>> <target>1.6</target> >>>>> </configuration> >>>>> <executions> >>>>> <execution> >>>>> <id>default-compile</id> >>>>> <configuration> >>>>> <excludes> >>>>> <exclude>**/module-info.java</exclude> >>>>> </excludes> >>>>> </configuration> >>>>> </execution> >>>>> </executions> >>>>> </plugin> >>>>> </plugins> >>>>> </build> >>>>> >>>>> <profiles> >>>>> <profile> >>>>> <id>jigsaw</id> >>>>> <activation> >>>>> <jdk>[1.9,)</jdk> >>>>> </activation> >>>>> <build> >>>>> <plugins> >>>>> <plugin> >>>>> <groupId>org.apache.maven.plugins</groupId> >>>>> <artifactId>maven-compiler-plugin</artifactId> >>>>> <version>3.5.1</version> >>>>> <configuration> >>>>> <source>1.9</source> >>>>> <target>1.9</target> >>>>> </configuration> >>>>> <executions> >>>>> <execution> >>>>> <id>module-infos</id> >>>>> <phase>compile</phase> >>>>> <goals> >>>>> <goal>compile</goal> >>>>> </goals> >>>>> <configuration> >>>>> <includes> >>>>> <include>**/module-info.java</include> >>>>> </includes> >>>>> </configuration> >>>>> </execution> >>>>> </executions> >>>>> </plugin> >>>>> </plugins> >>>>> </build> >>>>> </profile> >>>>> </profiles> >>>>> ``` >>>>> >>>>> It does compile with older javac versions as a bonus. Given this is >>>>> nothing else than using `-source 9 -target 9` for module-info.java if >>>>> present, I dare to say maven-compiler-plugin can be adapted to figure >>>>> this >>>>> out on its own. >>>>> >>>>> >> --------------------------------------------------------------------- >> To unsubscribe, e-mail: [email protected] >> For additional commands, e-mail: [email protected] >> >> >
