mirror of https://github.com/sbt/sbt.git
The main reason for having both the RunFromSourceMain and LauncherBased scripted tests was that RunFromSourceMain would fail for any test that ended up accessing the sbt.Package$ object. This commit fixes this bug by reworking the classloader generated by RunFromSourceMain to invoke sbt, switching from the classpath to jar classpath (by setting exportJars = true) and entering sbt by calling `new xMain().run` rather than `xMain.run`. The reason for switching to the jar classpath is that the jvm seems to have issues when there are two classes provided in different directories that have the same case insensitive name, e.g. `sbt.package$` and `sbt.Package$`. If those classes are instead provided in different jars, the jvm seems to be able to handle it. Exporting the jars is not enough though, I had to rework the ClassLoader created in the launch method to have a layout that was recognized by xMainConfiguration. I reimplemented the AppConfiguration in java so that it could bootstrap itself in a single jar classloader (the only needed jar is the Scripted. If we export the jars in the build, then the NoClassDefErrors for `sbt.Package$` go away during scripted tests using RunSourceFromMain. This might make running tests in subprojects slightly slower but I think its a worthy tradeoff. |
||
|---|---|---|
| .. | ||
| src | ||
| NOTICE | ||