Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Compile and execute a JDK preview feature with Maven

With JDK/12 EarlyAccess Build 10, the JEP-325 Switch Expressions has been integrated as a preview feature in the JDK. A sample code for the expressions (as in the JEP as well):

Scanner scanner = new Scanner(System.in); Day day = Day.valueOf(scanner.next()); switch (day) {     case MONDAY, TUESDAY -> System.out.println("Back to work.") ;     case WEDNESDAY -> System.out.println("Wait for the end of week...") ;     case THURSDAY,FRIDAY -> System.out.println("Plan for the weekend?");     case SATURDAY, SUNDAY -> System.out.println("Enjoy the holiday!"); } 

where Day being an enum as

public enum Day {     MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY } 

The Preview Language and VM Features JEP-12 already elaborate how a feature can be enabled during compile and runtime using javac and java.

How can one try out this feature using Maven?

like image 661
Naman Avatar asked Sep 08 '18 06:09

Naman


People also ask

How do I enable preview feature in Java?

To compile source code with javac that uses preview features from JDK release n, use javac from JDK release n with the --enable-preview command-line option in conjunction with either the --release n or -source n command-line option.

Does maven compile Java?

Build Java code This will run Maven, telling it to execute the compile goal. When it's finished, you should find the compiled . class files in the target/classes directory. The package goal will compile your Java code, run any tests, and finish by packaging the code up in a JAR file within the target directory.

What is test compile in Maven?

mvn test-compile: Compiles the test source code. mvn test: Runs tests for the project. mvn package: Creates JAR or WAR file for the project to convert it into a distributable format. mvn install: Deploys the packaged JAR/ WAR file to the local repository.

How do I enable preview features in IntelliJ?

If you want to use preview features in the latest versions of Java in IntelliJ IDEA, you need to set the language level to "Preview". Go to Project Structure, ⌘; (macOS) or Ctrl+Alt+Shift+S (Windows/Linux), make sure you have the correct JDK selected, and pick the "Preview" option from the Language Level dropdown.


1 Answers

Step 1

One can make use of the following maven configurations to compile the code using the --enable-preview along with --release 12+ (e.g. 13, 14, 15) argument.

<build>     <plugins>         <plugin>             <groupId>org.apache.maven.plugins</groupId>             <artifactId>maven-compiler-plugin</artifactId>             <version>3.8.0</version>             <configuration>                 <release>12</release> <!-- <release>13/14/15</release> -->                 <compilerArgs>--enable-preview</compilerArgs>             </configuration>         </plugin>         <!-- This is just to make sure the class is set as main class to execute from the jar-->         <plugin>             <groupId>org.apache.maven.plugins</groupId>             <artifactId>maven-shade-plugin</artifactId>             <version>3.1.0</version>             <executions>                 <execution>                     <phase>package</phase>                     <goals>                         <goal>shade</goal>                     </goals>                     <configuration>                         <transformers>                             <transformer                                     implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer"/>                             <transformer                                     implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">                                 <mainClass>edu.forty.bits.expression.SwitchExpressions</mainClass>                             </transformer>                         </transformers>                     </configuration>                 </execution>             </executions>         </plugin>     </plugins> </build> 

Note:- I had to also ensure on my MacOS that my ~/.mavenrc file was configured to mark java 13 as the default java configured for maven.

Step 2

Execute the maven command to build the jar from the module classes

mvn clean verify  

Step 3

Use the command line to execute the main class of the jar created in the previous step as :

java --enable-preview -jar target/forty-bits-of-java-1.0.0-SNAPSHOT.jar 

the last argument is the path to the jar built by maven.

This produces the output as expected as:

enter image description here

(screenshot is from a previous execution.)

Source on GitHub


Edit: A learning from an unwanted debugging session, use the arguments in the format as follows:

<compilerArgs>     <arg>--enable-preview</arg> </compilerArgs> 

Reason being, if you specify two different arguments it doesn't fail during the configuration validation and the one found later overrules the effective config:

<compilerArgs>--enable-preview</compilerArgs> <compilerArgs>-Xlint:all</compilerArgs> 
like image 112
Naman Avatar answered Sep 30 '22 07:09

Naman