Multi-Release JAR файлове с Maven

1. Въведение

Една от новите функции, които Java 9 ни носи, е възможността за изграждане на Multi-Release JAR (MRJAR). Както се казва в предложението за подобрение на JDK, това ни позволява да имаме различни специфични версии на Java на клас в един и същ JAR.

В този урок ние изследваме как да конфигурираме MRJAR файл с помощта на Maven.

2. Мейвън

Maven е един от най-използваните инструменти за изграждане в екосистемата на Java; една от неговите възможности е опаковането на проект в JAR.

В следващите раздели ще разгледаме как да го използваме за изграждане на MRJAR вместо това.

3. Примерен проект

Нека започнем с основен пример.

Първо ще определим клас, който отпечатва използваната в момента версия на Java; преди Java 9, един от подходите, които бихме могли да използваме, беше методът System.getProperty :

public class DefaultVersion { public String version() { return System.getProperty("java.version"); } }

Сега, от Java 9 и нагоре, можем да използваме метода на новата версия от класа Runtime :

public class DefaultVersion { public String version() { return Runtime.version().toString(); } }

С този метод можем да получим екземпляр на клас Runtime.Version , който ни дава информация за JVM, използван в новия формат на низови версии.

Освен това, нека добавим клас на приложение, за да регистрираме версията:

public class App { private static final Logger logger = LoggerFactory.getLogger(App.class); public static void main(String[] args) { logger.info(String.format("Running on %s", new DefaultVersion().version())); } }

И накрая, нека поставим всяка версия на DefaultVersion в собствената си структура на src / main directory:

├── pom.xml ├── src │   ├── main │   │   ├── java │   │   │   └── com │   │   │   └── baeldung │   │   │   └── multireleaseapp │   │   │   ├── DefaultVersion.java │   │   │   └── App.java │   │   └── java9 │   │   └── com │   │   └── baeldung │   │   └── multireleaseapp │   │   └── DefaultVersion.java 

4. Конфигурация

За да конфигурираме MRJAR от класовете по-горе, трябва да използваме два плъгина на Maven: приставката Compiler и приставката JAR.

4.1. Приставка за компилатор Maven

В приставката на Maven Compiler трябва да конфигурираме по едно изпълнение за всяка версия на Java, която ще пакетираме.

В този случай добавяме две:

   org.apache.maven.plugins maven-compiler-plugin   compile-java-8  compile   1.8 1.8    compile-java-9 compile  compile   9  ${project.basedir}/src/main/java9  ${project.build.outputDirectory}/META-INF/versions/9      

Ще използваме първото изпълнение compile-java-8, за да компилираме нашия клас Java 8 и изпълнението compile-java-9, за да компилираме нашия клас Java 9.

Виждаме, че е необходимо да конфигурирате таговете compileSourceRoot и outputDirectory със съответните папки за версията на Java 9.

Въпреки това, от maven-compiler-plugin 3.7.1, не е необходимо да задаваме изходната директория ръчно. Вместо това всичко, което трябва да направим, е да активираме свойството multiReleaseOutput :

 9  ${project.basedir}/src/main/java9  true 

Когато е зададено на true , приставката на компилатора премества всички специфични за изданието класове в директорията META-INF / versions / $ {release} . Моля, имайте предвид, че тук трябва да зададем маркера за освобождаване на желаната версия на Java, в противен случай приставката на компилатора не успее .

4.2. Maven JAR приставка

Използваме приставката JAR, за да зададем записа Multi-Release на true в нашия MANIFEST файл. С тази конфигурация времето за изпълнение на Java ще погледне в папката META-INF / версии на нашия JAR файл за специфични за версията класове; в противен случай се използват само базовите класове.

Нека добавим конфигурацията на плъгин maven-jar :

 org.apache.maven.plugins maven-jar-plugin 3.2.0    true    

5. Тестване

Време е да тестваме генерирания ни JAR файл.

Когато изпълним с Java 8, ще видим следния изход:

[main] INFO com.baeldung.multireleaseapp.App - Running on 1.8.0_252

Но ако изпълним с Java 14, ще видим:

[main] INFO com.baeldung.multireleaseapp.App - Running on 14.0.1+7

Както виждаме, сега той използва новия изходен формат. Имайте предвид, че въпреки че нашият MRJAR е създаден с Java 9, той е съвместим с множество основни версии на платформата на Java.

6. Заключение

В този кратък урок видяхме как да конфигурираме инструмента за изграждане на Maven, за да генерира прост MRJAR.

Както винаги, пълният код, представен в този урок, е достъпен в GitHub.