Ошибка получения Java 11 JLink: автоматический модуль нельзя использовать с jlink: com.microsoft.sqlserver.jdbc из файла

Я пытаюсь добавить модуль соединителя JDBC в свой проект с Java 11. Я загрузил драйвер MSSqlServer JDBC 7.2 для Java 11.

https://www.microsoft.com/en-us/download/details.aspx?id=57782

Я добавил модуль:

requires com.microsoft.sqlserver.jdbc;

Тем не менее, когда я пытаюсь выполнить очистку+сборку, NetBeans сообщает мне:

Error: automatic module cannot be used with jlink: com.microsoft.sqlserver.jdbc from file: /sqljdbc_7.2/enu/mssql-jdbc-7.2.2.jre11.jar

Я почти уверен, что это потому, что в банке нет скомпилированного файла module-info.java. Тем не менее, мне было интересно, есть ли способ ввести его туда?


person trilogy    schedule 18.06.2019    source источник
comment
Вы можете использовать jdeps для создания файла module-info.java, а затем скомпилировать его. Тогда вам просто нужно добавить module-info.class в файл JAR, я думаю.   -  person Slaw    schedule 19.06.2019
comment
@Slaw это настоящая боль. Существует так много зависимостей, которые также должны быть модульными ... Есть ли способ использовать jlink для создания пользовательской среды выполнения, но включать дополнительные устаревшие банки с внешней средой выполнения?   -  person trilogy    schedule 19.06.2019
comment
Не с jlink. Если вы используете Maven, вы можете использовать этот подключаемый модуль. Похоже, у них также есть плагин для Gradle. Вы также можете попробовать jpackage, хотя в настоящее время он находится в раннем доступе и основан на JDK 13. От моего Опыт работы с этим инструментом позволяет вам смешивать пути к модулям/путям к классам или явные/автоматические модули. Однако, в отличие от jlink, инструмент jpackage не поддерживает кросс-платформенную упаковку.   -  person Slaw    schedule 19.06.2019
comment
Обратите внимание, что когда я говорю смешайте пути к модулям/путям к классам или явные/автоматические модули, я действительно имею в виду либо-или. Если ваш код является модульным, и вы хотите использовать его в пути к модулям, тогда все должно быть в пути к модулям. Это связано с тем, что явные модули не имеют доступа к пути к классам (т. е. к безымянному модулю). Однако зависимости от пути к модулям не обязательно должны быть явными модулями; они могут быть автоматическими модулями. Если ваш код не является модульным, то вы можете иметь вещи в пути к модулям и свой код в пути к классам (хотя вам, вероятно, придется использовать --add-modules).   -  person Slaw    schedule 19.06.2019
comment
Я думаю, что невозможно найти какой-либо серьезный проект, в котором не будет модулей с автоматическими именами модулей, например, в Spring они есть. Таким образом, jlink мы можем использовать только для создания пользовательского jre, но не для связывания модулей нашего проекта.   -  person Pavel_K    schedule 25.11.2020