Сугубо градловские вопросы

ReyMagos

Тег-бомбастер
413
7
131
Всем добрый день! Делаю annotation processor, который, например, добавлял бы все методы с @Init в список во время компиляции, чтобы потом пробежаться по этому списку и все методы вызвать. Или фичи, а-ля lombok. Но не хочу компилировать его и привязывать, как библиотеку. Сделал для него отдельный модуль, чтобы компилировать его раньше остальных. Для этих целей нашёл градловскую альтернативу мавенскому assembly-plugin. Distribuition plugin зовётся. Но документация градла умеет держать тайны. Может кто-то делал такое или сможет объяснить, как это реализовать? Насколько я знаю в minecraft такое тоже есть. Буду очень благодарен!
build.gradle:
Java:
plugins {
    id "java"
    id "distribution"
}

group "com.example"
version "1.0-pre"

repositories {
    mavenCentral()
}

sourceSets {
    core {
        java {
            srcDirs("core/java")
        }
        resources {
            srcDirs("core/resources")
        }
    }
    preprocessor {
        java {
            srcDirs("preprocessor/java")
        }
        resources {
            srcDirs("preprocessor/resources")
        }
    }
}

distributions {
    main {
        contents {
            from("preprocessor/java") {
                // Не знаю правильно ли вообще к модулю обращаюсь.
            }
            into("lib/") {
                //
            }
        }
    }
}

ext.libraries = [
    logback: [
        "org.slf4j:slf4j-api:1.7.30",
        "ch.qos.logback:logback-core:1.2.3",
        "ch.qos.logback:logback-classic:1.2.3"
    ],
    lwjgl: [
        "org.lwjgl:lwjgl",
        "org.lwjgl:lwjgl-glfw",
        "org.lwjgl:lwjgl-opengl"
    ],
    lwjglRuntime: [
        "org.lwjgl:lwjgl::natives-windows",
        "org.lwjgl:lwjgl-glfw::natives-windows",
        "org.lwjgl:lwjgl-opengl::natives-windows"
    ]
]

dependencies {
    coreImplementation libraries.logback
    coreImplementation platform("org.lwjgl:lwjgl-bom:3.2.3")
    coreImplementation libraries.lwjgl
    coreRuntimeOnly libraries.lwjglRuntime
}

P.S. В идеале код из processor'а должен изменить при компиляции код core'а, но в финальный jar-ник не должен попасть.
 
Посмотри воркспейс ElegantNetworking
 
Тааак. Вот Annotation Processing. Там используется доп. библиотека для генерации кода, но мне бы сначала просто получить сообщение в логе о том, что класс выполнен в процессе компиляции) ASM работает во время рантайма, если я не ошибаюсь, а мне нужно во время компиляции. Проще говоря, с помощью аннотация я добавляю сахара к коду. А потом надо провести десахаризацию, чтобы в джарнике появилось то, что мне было так лень писать без сахара)

Посмотри воркспейс ElegantNetworking
Да, это очень похоже на то, что мне нужно. Только у тебя твой AP уже залит на gitlab, как джарник, а мне нужно, чтобы он компилился из модуля в проекте.
 
чтобы он компилился из модуля в проекте
В вокрспейсе EN именно так и происходит
Не в воркспейсах модов, которые от него зависят, а в его собственном воркспейсе
 
ASM работает во время рантайма, если я не ошибаюсь, а мне нужно во время компиляции.
Эм, ты читаешь класс, делаешь что нужно и сохраняешь обратно в файл. Эти файлы собираешь в джарник.

Они работают с исходным кодом, а не со скомпилированным классом, угу.
Иди читай как в IDEA работать с этим. Это именно то что тебе нужно.
 
В вокрспейсе EN именно так и происходит
Понял, разбираюсь, много всего интересного.
Это ведь оно, верно? annotationProcessor project(':ElegantNetworkingAnnotationProcessor')
Эм, ты читаешь класс, делаешь что нужно и сохраняешь обратно в файл. Эти файлы собираешь в джарник.
Логично, сразу не подумал. Но сначала добью AP.
Иди читай как в IDEA работать с этим. Это именно то что тебе нужно.
Да, уже копал. Но не всё понял, так что ещё посмотрю.
 
Благодаря вашим стараниям смог почти всё сделать. Остался один вопрос, где хранить аннотации? Их мне нужно задействовать и в модуле процессора, и в главном модуле проекта. Хранить их нельзя ни там, ни там, иначе придётся компилировать какой-то модуль раньше, чем нужно. Или вообще произойдёт рекурсивная зависимость.
В EN отдельный модуль, который только хранит и не использует эти аннотации. Это только так и возможно? Просто не хочется плодить модули, тем более ради пары аннотаций.
 
Всё! Ра-бо-та-ет! Огромное вам спасибо! И видос, и рабочий пример, что ещё нужно для хорошей жизни?) :)
 
Назад
Сверху