Я создал Java 13 проект, который использует модульную систему и хочет использовать LITIEngine , библиотеку игр, созданную с java 8.
После добавления зависимости в Maven, используя:
<dependency>
<groupId>de.gurkenlabs</groupId>
<artifactId>litiengine</artifactId>
<version>0.4.18</version>
</dependency>
Я ожидал использовать его в качестве автоматического c модуля, в моем module-info.java
:
module com.myproject {
require litiengine; // Error: Module litiengine not found.
}
Удивительно, но похоже, это не автоматический c модуль, поэтому я схватил банку , выполнил команду jar --file=litiengine-0.4.18.jar --describe-module
и получил странный результат:
java.xml.bind jar:file:///D:/WhereverMyJarIs/litiengine-0.4.18.jar/!module-info.class
exports javax.xml.bind
exports javax.xml.bind.annotation
exports javax.xml.bind.annotation.adapters
exports javax.xml.bind.attachment
exports javax.xml.bind.helpers
exports javax.xml.bind.util
requires java.activation transitive
requires java.base mandated
requires java.desktop
requires java.logging
requires java.xml transitive
uses javax.xml.bind.JAXBContextFactory
Итак, Я должен использовать LITIEngine как java.xml.bind
? Это не имеет ничего общего с библиотекой, которую я хочу использовать. Это не имеет смысла!
Я все еще пытался потребовать это:
module com.myproject {
requires java.xml.bind; // IntelliJ gives an error: Ambiguous module reference: java.xml.bind
}
Несмотря на ошибку, которую мне дает IntelliJ, я пытался скомпилировать свой проект с Maven, содержащий простой файл HelloWorld.java
:
package com.myproject;
import de.gurkenlabs.litiengine.Game;
public class HelloWorld {
public static void main(String[] args) {
Game.init(args);
Game.start();
}
}
При запуске mvn compile
компиляция завершается неудачно (я установил maven.compiler.target
и maven.compiler.source
на 13
) :
Error:(3,21) java: package de.gurkenlabs.litiengine is not visible
На данный момент я просто попытался использовать свой проект как немодульный, но все еще использую Java 13, поэтому я просто удалил module-info.java
, и вот так он работает. Отлично, но я теряю возможность использовать систему модулей, которую мне нужно использовать в моем проекте.
Я попробовал еще одну вещь , я использовал банку LITIEngine, которую я схватил ранее, и удалил файл module-info.class
в нем, открыв файл jar как архив в 7-zip и удалив этот файл. Затем я добавил ее как локальную зависимость в maven с помощью:
mvn install:install-file -Dfile=./whereverItIs/litiengine-0.4.18.jar \
-DgroupId=com.myproject.jars -DartifactId=litiengine -Dversion=1 -Dpackaging=jar
И добавил ее как зависимость:
<dependency>
<groupId>com.myproject.jars</groupId>
<artifactId>litiengine</artifactId>
<version>1</version>
</dependency>
Я мог бы затем использовать библиотеку в своем module-info.java
module com.myproject {
require litiengine; // No errors this time!
}
А затем успешно скомпилируйте и запустите его!
Итак, это доказывает, что эта библиотека может работать при импорте в виде автоматического c модуля, но для этого мне нужно отредактировать файл jar и удалить module-info.class
, чтобы заставить его работать, что очень нежелательно , потому что это требует ручного действия каждый раз, когда библиотека получает обновление.
Идеальным решением было бы иметь возможность игнорировать файл module-info.class
, содержащийся в банке, и заставить систему модулей угрожать ему как автоматизированному c модулю , есть ли способ сделать это?