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

ReyMagos

Тег-бомбастер
412
7
121
Всем добрый день! Делаю 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-ник не должен попасть.
 
7,099
324
1,509
Посмотри воркспейс ElegantNetworking
 

ReyMagos

Тег-бомбастер
412
7
121
Тааак. Вот Annotation Processing. Там используется доп. библиотека для генерации кода, но мне бы сначала просто получить сообщение в логе о том, что класс выполнен в процессе компиляции) ASM работает во время рантайма, если я не ошибаюсь, а мне нужно во время компиляции. Проще говоря, с помощью аннотация я добавляю сахара к коду. А потом надо провести десахаризацию, чтобы в джарнике появилось то, что мне было так лень писать без сахара)

Посмотри воркспейс ElegantNetworking
Да, это очень похоже на то, что мне нужно. Только у тебя твой AP уже залит на gitlab, как джарник, а мне нужно, чтобы он компилился из модуля в проекте.
 
7,099
324
1,509
чтобы он компилился из модуля в проекте
В вокрспейсе EN именно так и происходит
Не в воркспейсах модов, которые от него зависят, а в его собственном воркспейсе
 

tox1cozZ

aka Agravaine
8,454
598
2,890
ASM работает во время рантайма, если я не ошибаюсь, а мне нужно во время компиляции.
Эм, ты читаешь класс, делаешь что нужно и сохраняешь обратно в файл. Эти файлы собираешь в джарник.

Они работают с исходным кодом, а не со скомпилированным классом, угу.
Иди читай как в IDEA работать с этим. Это именно то что тебе нужно.
 

ReyMagos

Тег-бомбастер
412
7
121
В вокрспейсе EN именно так и происходит
Понял, разбираюсь, много всего интересного.
Это ведь оно, верно? annotationProcessor project(':ElegantNetworkingAnnotationProcessor')
Эм, ты читаешь класс, делаешь что нужно и сохраняешь обратно в файл. Эти файлы собираешь в джарник.
Логично, сразу не подумал. Но сначала добью AP.
Иди читай как в IDEA работать с этим. Это именно то что тебе нужно.
Да, уже копал. Но не всё понял, так что ещё посмотрю.
 
7,099
324
1,509

ReyMagos

Тег-бомбастер
412
7
121
Благодаря вашим стараниям смог почти всё сделать. Остался один вопрос, где хранить аннотации? Их мне нужно задействовать и в модуле процессора, и в главном модуле проекта. Хранить их нельзя ни там, ни там, иначе придётся компилировать какой-то модуль раньше, чем нужно. Или вообще произойдёт рекурсивная зависимость.
В EN отдельный модуль, который только хранит и не использует эти аннотации. Это только так и возможно? Просто не хочется плодить модули, тем более ради пары аннотаций.
 
7,099
324
1,509

ReyMagos

Тег-бомбастер
412
7
121
Всё! Ра-бо-та-ет! Огромное вам спасибо! И видос, и рабочий пример, что ещё нужно для хорошей жизни?) :)
 
Сверху