Hi, I see that this feature is unlikely to be in Java 9 ;) , but I want to give it one last push before conceding:
> Comparing the two ways of compiling a set of modules ... > > Compiling modules one at a time (when that is possible) is the > smallest overall change for both the IDE and developer. Each module > can be compiled and built separately, and the resulting modules can > be put individually on the module path. > > Compiling modules together may yield a faster overall compilation > times, and the use of a single output directory makes it much > easier to set up the module path at runtime. Compiling all modules at once with a module name token in the path "may yield faster overall compilation times" and "the resulting modules can be put individually on the module path". Looks like a mix of characteristics that is otherwise not possible to achieve convenientl y. so long ... Nicolai On 25.01.2017 23:50, Jonathan Gibbons wrote: > Stephan, > > There will be many cases where one project contains one module and > for those cases, the single module mode compilation will be > sufficient and bears the most similarity to the way people > organize their project today. > > At the other end of the scale, there will be cases where a set of > closely-coupled modules have to be compiled together, and > multi-module mode was designed to address those cases. In this > situation, having the class files end up in a single directory > hierarchy organized by module should not be surprising. > > In between, there may be projects that contain a set of loosely > related modules, such that they can be compiled one module at a > time in a topologically sorted order. For these projects, it > becomes a design choice for the IDE vendor and/or a use choice for > the developer whether to use a series of compilations, one per > module, into distinct class output directories, or whether to > compile them all together, and have the classes written to a single > module-oriented output directory. Either way, the effective > compilation will be the same, and the same checks for strong > encapsulation should be in effect between the modules. > > (For your example of a set of separate projects, each with its own > sourcefolder and binfolder, I would expect each project to have > its own independent build "script", which each come down to one of > the three preceding cases.) > > Comparing the two ways of compiling a set of modules ... > > Compiling modules one at a time (when that is possible) is the > smallest overall change for both the IDE and developer. Each module > can be compiled and built separately, and the resulting modules can > be put individually on the module path. > > Compiling modules together may yield a faster overall compilation > times, and the use of a single output directory makes it much > easier to set up the module path at runtime. > > -- Jon > > > On 01/25/2017 12:05 PM, Stephan Herrmann wrote: >> I found the general direction of this proposal interesting, but >> from the reluctance to accept this, I start to think, that maybe >> the role of multi-module compilation was overrated? >> >> I assume that the majority of source code out there is organized >> in some structure like Project1 + sourcefolder + binfolder >> Project2 + sourcefolder + binfolder ... Note there is nothing >> outside of projects. I don't believe this is going to change any >> time soon. Tools know how to find .class files in this >> structure. >> >> When projects become modules, at first look it sounds compelling >> to perform a multi-module compilation on several projects in one >> invocation. (Compelling for reasons of "simplicity" as well as >> performance ...). If scattering .class files into unrelated >> binfolders is not intended, this seems to suggest to forget about >> multi-module compilation, and keep compiling one project/module >> at a time, where we can specify individual output folders. >> >> Is that the message? >> >> Maybe, at the end of the pipeline there will be one use case >> where multi-module compilation will indeed collect "everything" >> into one global bin folder, ready for packaging and shipping, but >> that would be the least frequently performed use case, and then >> it's much easier to just copy / merge (or link) the individual >> binfolders into one. >> >> Any positive reasons to consider multi-module builds after all? >> >> thanks, Stephan >> >> On 01/25/2017 07:38 PM, Jonathan Gibbons wrote: >>> >>> >>> On 1/25/17 12:20 AM, Nicolai Parlog wrote: > Hi Jonathan, > > thanks for considering this. > >>>>>> If nothing else, it would require all the module-specific >>>>>> output directories to be created ahead of time, so that >>>>>> javac can determine which ones to use > Why would that be the case? It is not necessary to create them now > so why would using asterisk change that? >>>> >>>> OK, I missed that you were not suggesting to adopt all of >>>> the functionality of module source path, including the >>>> ability to specify a path of output locations, so that module >>>> classes could be written into a directory that is more >>>> closely associated with the source code. >>>> > >>>>>> It has always been the case that a single compilation >>>>>> for different packages from different libraries would >>>>>> result in the classes being placed in a single output >>>>>> directory hierarchy, and that the classes could then be >>>>>> selectively packaged into different files like .jar >>>>>> files. > It has also always been the case that the compiler had no notion > of projects/artifacts/modules but just of plain source files. ;) > That changed, too, so why not do the same for class files? > >>>>>> If you're compiling modules together, why could you not >>>>>> do something similar? > I have no particular use case (except writing some demos) but I > would guess that it would make it more comfortable for existing > tools to move towards multi-module compilation. >>>> I don't see any reason why the current design would make it >>>> harder for tools to move towards multi-module compilation. >>>> > > I also like this idea for its symmetry. You can define input the > compilers input, sorted by modules, with *, so why not do the same > for its output? Conceptually that should be obvious (which does not > mean that there are not plenty if reasons against it). >>>> >>>> There is a much stronger, more compelling relationship in >>>> play. The current -d option is designed so that you can put >>>> the output directory on the class path or module path as >>>> appropriate. That's always been the case for the classpath -- >>>> even though source may come from a variety of directory >>>> hierarchies, the compiled classes are put into a simple >>>> directory hierarchy that can be put on the classpath. Now, >>>> with modules, that continues to be the case: you can put the >>>> -d output directory on the runtime module path, either as a >>>> single "exploded module" or as a directory of "exploded >>>> modules". That is a compelling argument in favor of the >>>> current design of the javac output directory. >>>> >>>> In contrast, I don't see any compelling advantage to >>>> allowing -d "./*/target/classes" since that would make it >>>> significantly harder to place such a directory on the runtime >>>> module path. >>>> >>>> -- Jon >>>> > > so long ... Nicolai > > > > On 23.01.2017 20:51, Jonathan Gibbons wrote: >>>>>> Nicolai, >>>>>> >>>>>> I don't think this proposal is a good way to go. If >>>>>> nothing else, it would require all the module-specific >>>>>> output directories to be created ahead of time, so that >>>>>> javac can determine which ones to use, which would >>>>>> require additional setup commands to be executed after a >>>>>> "make clean" or its equivalent in other build systems. >>>>>> >>>>>> Also, I note that the output directory is typically never >>>>>> the final location for the compiled classes; it is >>>>>> typically just a "staging area". It has always been the >>>>>> case that a single compilation for different packages >>>>>> from different libraries would result in the classes >>>>>> being placed in a single output directory hierarchy, and >>>>>> that the classes could then be selectively packaged into >>>>>> different files like .jar files. If you're compiling >>>>>> modules together, why could you not do something >>>>>> similar? >>>>>> >>>>>> -- Jon >>>>>> >>>>>> >>>>>> >>>>>> On 01/21/2017 02:00 AM, Nicolai Parlog wrote: >>>>>>> Hi! >>>>>>> >>>>>>> Another feature request from the trenches regarding >>>>>>> multi-module compilation. (It is possible that there >>>>>>> was a similar thread a couple of days/weeks (?) back >>>>>>> but I didn't find it.) >>>>>>> >>>>>>> It would be nice to have the ability to specify module >>>>>>> specific target folders, so they do not automatically >>>>>>> end up in `<whatever-was-given-to-d>/<module-name>`. >>>>>>> >>>>>>> It seems obvious (which could very well make it stupid) >>>>>>> to reuse the asterisk here and allow something like >>>>>>> >>>>>>> javac --module-path mods --module-source-path >>>>>>> "./*/src/main/java" -d "./*/target/classes" -module >>>>>>> initial.module >>>>>>> >>>>>>> I have not thought through how this might or might not >>>>>>> work with multiple module source paths. It looks like >>>>>>> the only tractable approach would be to not allow more >>>>>>> than one -d element. >>>>>>> >>>>>>> so long ... Nicolai >>>>>>> >>>>>>> >>>>>>> > -- PGP Key: > http://keys.gnupg.net/pks/lookup?op=vindex&search=0xCA3BAD2E9CCCD509 > > Web: http://codefx.org a blog about software development > https://www.sitepoint.com/java high-quality Java/JVM content > http://do-foss.de Free and Open Source Software for the City of > Dortmund > > Twitter: https://twitter.com/nipafx >>> >> > -- PGP Key: http://keys.gnupg.net/pks/lookup?op=vindex&search=0xCA3BAD2E9CCCD509 Web: http://codefx.org a blog about software development https://www.sitepoint.com/java high-quality Java/JVM content http://do-foss.de Free and Open Source Software for the City of Dortmund Twitter: https://twitter.com/nipafx