#maven #kotlin #java-11 #java-platform-module-system
#maven #kotlin #java-11 #java-platform-module-system
Вопрос:
При компиляции с Java 11 я получаю следующие ошибки.
Symbol is declared in module 'java.xml' which does not export package 'com.sun.org.apache.xerces.internal.xni.parser'
Symbol is declared in module 'java.base' which does not export package 'sun.net.www.protocol.http'
Symbol is declared in module 'java.base' which does not export package 'sun.net.www.protocol.file'
Symbol is declared in module 'java.xml' which does not export package 'com.sun.org.apache.xerces.internal.util'
Symbol is declared in module 'java.xml' which does not export package 'com.sun.org.apache.xerces.internal.xni.parser'
Symbol is declared in module 'java.xml' which does not export package 'com.sun.org.apache.xerces.internal.xni.parser'
Symbol is declared in module 'java.xml' which does not export package 'com.sun.org.apache.xerces.internal.xni.parser'
[...]
Symbol is declared in module 'java.xml' which does not export package 'com.sun.org.apache.xerces.internal.impl.dtd'
Мне нужно указать --add-exports
директиву для компиляции Java.
Я не знаю, как добавить ее в мою сборку Maven, компилирующую код Kotlin.
Кроме того, я не уверен в точных значениях для --add-exports
.
Это мое pom.xml
.
<!-- Kotlin compilation -->
<build>
<plugins>
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
<configuration>
<sourceDirs>
<source>src/main/java</source>
<source>src/main/kotlin</source>
</sourceDirs>
</configuration>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<jvmTarget>1.8</jvmTarget>
</configuration>
</plugin>
<!-- Bundle a standalone JAR -->
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<finalName>${project.artifactId}-${project.version}-all</finalName>
<appendAssemblyId>false</appendAssemblyId>
<archive>
<manifest>
<mainClass>DtdFinderKt</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- Attempt to specify --add-export -->
<profiles>
<profile>
<id>java11-compiler-java-with-kotlin</id>
<activation>
<file><exists>${basedir}/src/main/kotlin</exists></file>
<jdk>[11,)</jdk>
</activation>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<compilerArgs>
<arg>--add-exports</arg><arg>java.xml/com.sun.org.apache.xerces.internal.impl.dtd=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>java.xml/com.sun.org.apache.xerces.internal.xni.parser=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>java.base/sun.net.www.protocol.http=ALL-UNNAMED</arg>
<arg>--add-exports</arg><arg>jdk.unsupported/sun.misc=ALL-UNNAMED</arg>
</compilerArgs>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
Комментарии:
1. как насчет формата
<arg>--add-exports java.xml/com.sun.org.apache.xerces.internal.impl.dtd=ALL-UNNAMED</arg>
?2. @Naman Это не сработало. Те же ошибки.
3. Отмеченная конфигурация
Attempt to specify --add-export
добавляет аргумент командной строки в maven-compiler-plugin , но это компилирует только исходные файлы Java. Вы уверены, что именно они зависят от внутреннего кода, а не от ваших файлов Kotlin? Кроме того, это может быть сам плагин компилятора, который использует эти внутренние API, а не код при компиляции. В этом случае вам нужно добавить--add-exports
в процесс компиляции. Для процесса Maven.mavenrc
может сделать это (я думаю) — не уверен, как это сделать, если процесс компиляции разветвлен.4. @Nicolai Да, API используются в коде Kotlin. Проект находится только в Kotlin.
5. В принципе, мне нужно найти эквивалент —add-export для kotlin-compiler.
Ответ №1:
Решение состоит в том, чтобы включить аннотацию в начале каждого исходного файла с использованием внутренних API.
@file:Suppress("JAVA_MODULE_DOES_NOT_EXPORT_PACKAGE")
Эта аннотация была найдена благодаря этой теме на форуме поддержки Kotlin.
Ответ №2:
Попробуйте добавить этот плагин компилятора в свой kotlin-maven-plugin
kotlin-maven-allopen
Ваш pom будет выглядеть примерно так после добавления:
<plugin>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-plugin</artifactId>
<version>${kotlin.version}</version>
<executions>
<execution>
<id>compile</id>
<phase>compile</phase>
<goals>
<goal>compile</goal>
</goals>
</execution>
<execution>
<id>test-compile</id>
<phase>test-compile</phase>
<goals>
<goal>test-compile</goal>
</goals>
</execution>
</executions>
<configuration>
<args>
<arg>-Xjsr305=strict</arg>
</args>
<compilerPlugins>
<plugin>spring</plugin>
</compilerPlugins>
<jvmTarget>1.8</jvmTarget>
</configuration>
<dependencies>
<dependency>
<groupId>org.jetbrains.kotlin</groupId>
<artifactId>kotlin-maven-allopen</artifactId>
<version>${kotlin.version}</version>
</dependency>
</dependencies>
</plugin>
Официальная документация по плагину:https://kotlinlang.org/docs/all-open-plugin.html
Комментарии:
1. Спасибо, что поделились этой отличной альтернативой.
2. Действительно ли это альтернатива? Я думаю, что выше описано, как сделать классы Kotlin «открытыми», иначе «не окончательными». Это полезно при использовании чего-то вроде Spring, который генерирует прокси и нуждается в открытых / не финальных классах. Но вопрос был о модулях Java, или я что-то упускаю?