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:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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]
|
||||
|
||||
Reference in New Issue
Block a user