Как заставить использовать jar как автоматический c модуль, не редактируя его? - PullRequest
1 голос
/ 19 января 2020

Я создал 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 модулю , есть ли способ сделать это?

...