Add jep511 module: module import declarations on JDK 25 and 27

Runnable sources, deliberate compile failures, three small modules and nine captured transcripts for import module (JEP 511).

Co-Authored-By: Claude Sonnet 5 <[email protected]>
Claude-Session: https://claude.ai/code/session_01TF9JWFvJSNm6HVzswzZU5a
This commit is contained in:
Claude
2026-09-24 10:57:57 +00:00
parent 2ebea58d39
commit 385cc25233
44 changed files with 715 additions and 0 deletions
+15
View File
@@ -0,0 +1,15 @@
$ javac src/OldWay.java && java OldWay (25.0.4.1+1-LTS)
{a=[apple, avocado], b=[banana, blueberry], c=[cherry]}
a/b/c.txt on 2026-09-15
$ javac src/OldWay.java && java OldWay (27+35)
{a=[apple, avocado], b=[banana, blueberry], c=[cherry]}
a/b/c.txt on 2026-09-15
$ javac src/NewWay.java && java NewWay (25.0.4.1+1-LTS)
{a=[apple, avocado], b=[banana, blueberry], c=[cherry]}
a/b/c.txt on 2026-09-15
$ javac src/NewWay.java && java NewWay (27+35)
{a=[apple, avocado], b=[banana, blueberry], c=[cherry]}
a/b/c.txt on 2026-09-15
+43
View File
@@ -0,0 +1,43 @@
$ javac broken/AmbiguousDate.java (25.0.4.1+1-LTS)
broken/AmbiguousDate.java:6: error: reference to Date is ambiguous
Date d = new Date(0L);
^
both class java.sql.Date in java.sql and class java.util.Date in java.util match
broken/AmbiguousDate.java:6: error: reference to Date is ambiguous
Date d = new Date(0L);
^
both class java.sql.Date in java.sql and class java.util.Date in java.util match
2 errors
$ javac broken/AmbiguousDate.java (27+35)
broken/AmbiguousDate.java:6: error: reference to Date is ambiguous
Date d = new Date(0L);
^
both class java.sql.Date in java.sql and class java.util.Date in java.util match
broken/AmbiguousDate.java:6: error: reference to Date is ambiguous
Date d = new Date(0L);
^
both class java.sql.Date in java.sql and class java.util.Date in java.util match
2 errors
$ javac broken/AmbiguousList.java (25.0.4.1+1-LTS)
broken/AmbiguousList.java:6: error: reference to List is ambiguous
List<String> names = new ArrayList<>();
^
both class java.awt.List in java.awt and interface java.util.List in java.util match
1 error
$ javac broken/AmbiguousList.java (27+35)
broken/AmbiguousList.java:6: error: reference to List is ambiguous
List<String> names = new ArrayList<>();
^
both class java.awt.List in java.awt and interface java.util.List in java.util match
1 error
$ javac src/FixedDate.java && java FixedDate (25.0.4.1+1-LTS)
java.util.Date
java.sql.Date
$ javac src/FixedDate.java && java FixedDate (27+35)
java.util.Date
java.sql.Date
+31
View File
@@ -0,0 +1,31 @@
$ javac src/StarImportWins.java && java StarImportWins (25.0.4.1+1-LTS)
java.util.Date
$ javac src/StarImportWins.java && java StarImportWins (27+35)
java.util.Date
$ javac src/StarImportWinsSql.java && java StarImportWinsSql (25.0.4.1+1-LTS)
java.sql.Date
$ javac src/StarImportWinsSql.java && java StarImportWinsSql (27+35)
java.sql.Date
$ javac src/SamePackageWins.java && java SamePackageWins (25.0.4.1+1-LTS)
my own Date
java.util.Date
$ javac src/SamePackageWins.java && java SamePackageWins (27+35)
my own Date
java.util.Date
$ javac src/UnusedAmbiguity.java && java UnusedAmbiguity (25.0.4.1+1-LTS)
no Date mentioned, no error
$ javac src/UnusedAmbiguity.java && java UnusedAmbiguity (27+35)
no Date mentioned, no error
$ javac src/DuplicateImports.java && java DuplicateImports (25.0.4.1+1-LTS)
[dups are fine]
$ javac src/DuplicateImports.java && java DuplicateImports (27+35)
[dups are fine]
@@ -0,0 +1,71 @@
$ java --describe-module java.sql (25.0.4.1+1-LTS)
[email protected]
exports java.sql
exports javax.sql
requires java.xml transitive
requires java.logging transitive
requires java.transaction.xa transitive
requires java.base mandated
uses java.sql.Driver
$ java --describe-module java.se | grep -c 'requires' (25.0.4.1+1-LTS)
20
$ java --describe-module java.se | grep -c exports (25.0.4.1+1-LTS)
0
$ javac src/Transitive.java && java Transitive (25.0.4.1+1-LTS)
demo
0
java.xml
[java.base needed its own import]
$ javac src/Transitive.java && java Transitive (27+35)
demo
0
java.xml
[java.base needed its own import]
$ javac broken/SqlDoesNotGiveBase.java (25.0.4.1+1-LTS)
broken/SqlDoesNotGiveBase.java:5: error: cannot find symbol
List<String> l = List.of("x"); // java.util.List lives in java.base
^
symbol: class List
location: class SqlDoesNotGiveBase
broken/SqlDoesNotGiveBase.java:5: error: cannot find symbol
List<String> l = List.of("x"); // java.util.List lives in java.base
^
symbol: variable List
location: class SqlDoesNotGiveBase
2 errors
$ javac broken/SqlDoesNotGiveBase.java (27+35)
broken/SqlDoesNotGiveBase.java:5: error: cannot find symbol
List<String> l = List.of("x"); // java.util.List lives in java.base
^
symbol: class List
location: class SqlDoesNotGiveBase
broken/SqlDoesNotGiveBase.java:5: error: cannot find symbol
List<String> l = List.of("x"); // java.util.List lives in java.base
^
symbol: variable List
location: class SqlDoesNotGiveBase
2 errors
$ javac src/JavaSe.java (25.0.4.1+1-LTS)
src/JavaSe.java:1: error: unnamed module does not read: java.se
import module java.se;
^
1 error
$ javac src/JavaSe.java (27+35)
src/JavaSe.java:1: error: unnamed module does not read: java.se
import module java.se;
^
1 error
$ javac --add-modules java.se src/JavaSe.java && java JavaSe (25.0.4.1+1-LTS)
[a] x 0
$ javac --add-modules java.se src/JavaSe.java && java JavaSe (27+35)
[a] x 0
+48
View File
@@ -0,0 +1,48 @@
$ javac src/InPackage.java && java demo.mod.InPackage (25.0.4.1+1-LTS)
[1, 2, 3] from package demo.mod
$ javac src/InPackage.java && java demo.mod.InPackage (27+35)
[1, 2, 3] from package demo.mod
$ javac -d out --module-source-path multi --module acme.text,demo.app && java -p out -m demo.app/demo.App (25.0.4.1+1-LTS)
import-module-hello-world
$ javac -d out --module-source-path multi --module acme.text,demo.bad (25.0.4.1+1-LTS)
multi/demo.bad/demo/Bad.java:7: error: cannot find symbol
System.out.println(Helper.clean("x")); // Helper is in the non-exported acme.text.internal
^
symbol: variable Helper
location: class Bad
1 error
$ javac -d out --module-source-path multi --module demo.noreq (25.0.4.1+1-LTS)
multi/demo.noreq/demo/NoReq.java:3: error: module demo.noreq does not read: java.sql
import module java.sql; // demo.noreq never says "requires java.sql"
^
1 error
$ javac -d out --module-source-path multi --module acme.text,demo.app && java -p out -m demo.app/demo.App (27+35)
import-module-hello-world
$ javac -d out --module-source-path multi --module acme.text,demo.bad (27+35)
multi/demo.bad/demo/Bad.java:7: error: cannot find symbol
System.out.println(Helper.clean("x")); // Helper is in the non-exported acme.text.internal
^
symbol: variable Helper
location: class Bad
1 error
$ javac -d out --module-source-path multi --module demo.noreq (27+35)
multi/demo.noreq/demo/NoReq.java:3: error: module demo.noreq does not read: java.sql
import module java.sql; // demo.noreq never says "requires java.sql"
^
1 error
$ javac -p lib src/ThirdParty.java (25.0.4.1+1-LTS)
src/ThirdParty.java:1: error: unnamed module does not read: acme.text
import module acme.text;
^
1 error
$ javac -p lib --add-modules acme.text src/ThirdParty.java && java -p lib --add-modules acme.text -cp out ThirdParty (25.0.4.1+1-LTS)
a-script-using-a-library-module
@@ -0,0 +1,56 @@
$ javac src/CompactNoImport.java && java CompactNoImport (25.0.4.1+1-LTS)
[no imports at all]
$ javac src/CompactNoImport.java && java CompactNoImport (27+35)
[no imports at all]
$ javac src/CompactPlusImport.java && java CompactPlusImport (25.0.4.1+1-LTS)
[java.base came implicitly] 0
$ javac src/CompactPlusImport.java && java CompactPlusImport (27+35)
[java.base came implicitly] 0
$ javac src/CompactAmbiguous.java (25.0.4.1+1-LTS)
src/CompactAmbiguous.java:4: error: reference to Date is ambiguous
Date d = new Date(0L); // implicit java.base (java.util.Date) vs explicit java.sql (java.sql.Date)
^
both class java.sql.Date in java.sql and class java.util.Date in java.util match
src/CompactAmbiguous.java:4: error: reference to Date is ambiguous
Date d = new Date(0L); // implicit java.base (java.util.Date) vs explicit java.sql (java.sql.Date)
^
both class java.sql.Date in java.sql and class java.util.Date in java.util match
2 errors
$ javac src/CompactAmbiguous.java (27+35)
src/CompactAmbiguous.java:4: error: reference to Date is ambiguous
Date d = new Date(0L); // implicit java.base (java.util.Date) vs explicit java.sql (java.sql.Date)
^
both class java.sql.Date in java.sql and class java.util.Date in java.util match
src/CompactAmbiguous.java:4: error: reference to Date is ambiguous
Date d = new Date(0L); // implicit java.base (java.util.Date) vs explicit java.sql (java.sql.Date)
^
both class java.sql.Date in java.sql and class java.util.Date in java.util match
2 errors
$ javac broken/ClassicNoImport.java (25.0.4.1+1-LTS)
broken/ClassicNoImport.java:3: error: cannot find symbol
System.out.println(List.of("no imports at all"));
^
symbol: variable List
location: class ClassicNoImport
1 error
$ javac broken/ClassicNoImport.java (27+35)
broken/ClassicNoImport.java:3: error: cannot find symbol
System.out.println(List.of("no imports at all"));
^
symbol: variable List
location: class ClassicNoImport
1 error
$ java src/Script.java (25.0.4.1+1-LTS)
a-b-c 2026-09-15
$ java src/Script.java (27+35)
a-b-c 2026-09-15
+29
View File
@@ -0,0 +1,29 @@
$ diff <(javap -c -p OldWay) <(javap -c -p NewWay) (25.0.4.1+1-LTS, class name normalised to X)
no differences (57 lines of javap output each)
$ cmp OldWay.class NewWay.class (javac -g:none; NewWay renamed to OldWay inside the class file)
identical, byte for byte (2249 bytes)
$ diff <(javap -c -p -l OldWay) <(javap -c -p -l NewWay) (default javac -g keeps line numbers)
8c8
< line 9: 0
---
> line 3: 0
52,57c52,57
< line 11: 0
< line 12: 14
< line 13: 25
< line 14: 37
< line 15: 44
< line 16: 90
---
> line 5: 0
> line 6: 14
> line 7: 25
> line 8: 37
> line 9: 44
> line 10: 90
67c67
< line 13: 0
---
> line 7: 0
@@ -0,0 +1,60 @@
$ javac broken/NoSuchModule.java (25.0.4.1+1-LTS)
broken/NoSuchModule.java:1: error: imported module not found: java.nosuch
import module java.nosuch;
^
1 error
$ javac broken/NoSuchModule.java (27+35)
broken/NoSuchModule.java:1: error: imported module not found: java.nosuch
import module java.nosuch;
^
1 error
$ javac broken/ModuleInsideClass.java (25.0.4.1+1-LTS)
broken/ModuleInsideClass.java:2: error: illegal start of type
import module java.base;
^
broken/ModuleInsideClass.java:2: error: ';' expected
import module java.base;
^
broken/ModuleInsideClass.java:2: error: <identifier> expected
import module java.base;
^
3 errors
$ javac broken/ModuleInsideClass.java (27+35)
broken/ModuleInsideClass.java:2: error: illegal start of type
import module java.base;
^
broken/ModuleInsideClass.java:2: error: ';' expected
import module java.base;
^
broken/ModuleInsideClass.java:2: error: <identifier> expected
import module java.base;
^
3 errors
$ javac --release 21 src/NewWay.java (25.0.4.1+1-LTS)
src/NewWay.java:1: error: module imports are not supported in -source 21
import module java.base;
^
(use -source 25 or higher to enable module imports)
1 error
exit=1
$ javac --release 24 src/NewWay.java (25.0.4.1+1-LTS)
src/NewWay.java:1: error: module imports are not supported in -source 24
import module java.base;
^
(use -source 25 or higher to enable module imports)
1 error
exit=1
$ javac --release 25 src/NewWay.java (25.0.4.1+1-LTS)
exit=0
$ javac src/NewWay.java (21.0.10+7-Ubuntu-124.04)
src/NewWay.java:1: error: '.' expected
import module java.base;
^
1 error
+21
View File
@@ -0,0 +1,21 @@
$ jshell --feedback concise src/imports.jsh (21.0.10+7-Ubuntu-124.04)
import java.io.*
import java.math.*
import java.net.*
import java.nio.file.*
import java.util.*
import java.util.concurrent.*
import java.util.function.*
import java.util.prefs.*
import java.util.regex.*
import java.util.stream.*
[2, 4]
$ jshell --feedback concise src/imports.jsh (25.0.4.1+1-LTS)
import java.base
[2, 4]
$ jshell --feedback concise src/imports.jsh (27+35)
import java.base
[2, 4]