Как удалить файл module-info.class из Java проекта?

Как удалить файл module-info.class из .jar-файла собранного мода для Minecraft 1.12.2, используя Artifact Transformer или другой метод? Я столкнулся с ошибками после добавления зависимостей через shadow plugin, и хотя они не влияют на работу мода, я хочу их устранить.
  • 5 декабря 2023 г. 16:59
Ответы на вопрос 2
Чтобы удалить файл `module-info.class` из .jar-файла мода для Minecraft, вы можете использовать различные способы. Для начала рассмотрим упомянутый вами Artifact Transformer и как его можно использовать в Gradle для удаления ненужного класса из .jar-файла.

Если в вашем проекте используется Gradle Shadow Plugin, вы можете добавить кастомный Transformer, который будет удалять файл `module-info.class` во время процесса сборки. Вот примерный код для вашего `build.gradle` файла:

```groovy
import com.github.jengelman.gradle.plugins.shadow.transformers.Transformer

// Создание кастомного трансформера
class DeleteModuleInfoTransformer implements Transformer {
    boolean canTransformResource(File file) {
        return file.name.equals("module-info.class")
    }

    boolean hasTransformedResource() {
        return true
    }

    void transform(URLClassLoader classLoader, File file) {
        if (file.name.equals("module-info.class")) {
            file.delete()
        }
    }

    void modifyOutputStream(ZipOutputStream jos, boolean preserveFileTimestamps) {
        // нет необходимости вносить изменения в поток вывода
    }
}

shadowJar {
    // Добавление кастомного трансформера
    transform(DeleteModuleInfoTransformer)
    // Остальная конфигурация shadowJar здесь
}
```

В этом коде создается класс `DeleteModuleInfoTransformer`, который реализует интерфейс `Transformer` и который будет удалять `module-info.class`.

Также можно использовать другие подходы, например, удаление файла `module-info.class` напрямую из собранного .jar-файла при помощи команды `zip` в командной строке:

```bash
zip -d path/to/your.jar module-info.class
```

Выполнение этой команды удалит файл `module-info.class` из указанного .jar-файла.

Если вам нужна программа с графическим интерфейсом, можно воспользоваться утилитами архивирования, такими как 7-Zip, WinRAR или любыми другими, которые поддерживают работу с архивами .jar (фактически zip-архивы).

1. Откройте .jar-файл с помощью вашей программы для архивирования.
2. Найдите `module-info.class` внутри архива.
3. Удалите его и сохраните изменения в архиве.

Наконец, если у вас есть подобные проблемы с избыточными файлами в .jar в будущем, вы можете настроить вашу сборку так, чтобы не включать ненужные классы и файлы. Многие плагины сборки, такие как Maven Shade Plugin или Gradle Shadow Plugin, предоставляют возможности для исключения файлов напрямую в конфигурации сборки.
На самом последнем stage (я думаю gradle это позволяет) тебе надо просто добавить еще одиншаг - очистка артифакта от Java9 modules. Я-бы это сделал в простом случае просто распаковкойартифакта во временный фолдер. Удалением файлов модулей и упаковкой обратно.Что то вроде.jar x .... -d target/temp  
find -type f -name module-info.class -delete
jar c ....
Похожие вопросы