Я экспериментирую с Gradle, чтобы построить несколько банок, вместо того, чтобы поддерживать список классов, в которых есть EJB, чтобы я мог развернуть их отдельно. Я думал, что может быть аккуратно сканировать классы при создании банку.Опубликовать артефакт переписать другой артефакт в Gradle
Вместо того, чтобы загружать классы и использовать отражение, чтобы получить аннотации, я подумал, что проще просканировать классы с помощью asm, следовательно, классный ClassReader в одной из задач.
Я не думаю, что это проблема, поэтому ее можно игнорировать, в основном у меня есть 2 задачи, которые я использую для определения содержимого банок, оба сообщают, что через них каждый контент отправляется через распечатку eachFile, однако когда я смотрю в месте публикации репозитория, оба файла и связанный с ним sha1 идентичны.
Либо Gradle сломан или, скорее, я сделал что-то сумасшедшее, но не могу понять, что это такое, может ли кто-нибудь помочь?
Кстати, если я отключу публикацию любого из файлов jar, тот, который создается, правильный, поэтому я думаю, что это что-то не так с публикацией, а не с jarring, но может быть неправильным.
// ASM is used to interpret the class files, this avoids having to load all classes in the vm and use reflection
import org.objectweb.asm.*
task ejbJar(type: Jar) {
//outputs.upToDateWhen { false }
from "${project.buildDir}/classes/main"
eachFile { println "EJB server: ${name}" }
include getEjbClassFiles(project.buildDir)
}
task clientEjbJar(type: Jar) {
//outputs.upToDateWhen { false }
from "${project.buildDir}/classes/main/com/company/core/versioner"
eachFile { println "Client EJB ${name}" }
include '**/*'
}
artifacts {
archives clientEjbJar
archives ejbJar
}
String[] getEjbClassFiles(base) {
def includedFiles = []
def baseDir = project.file("${base}/classes/main")
def parentPath = baseDir.toPath()
if (baseDir.isDirectory()) {
baseDir.eachFileRecurse(groovy.io.FileType.FILES) { file ->
if(file.name.endsWith('.class')) {
//get hold of annotations in there --- org.objectweb.asm.Opcodes.ASM4
def reader = new ClassReader(file.bytes).accept(
new ClassVisitor(Opcodes.ASM4) {
public AnnotationVisitor visitAnnotation(String desc, boolean visible) {
if(desc.equals("Ljavax/ejb/Stateless;") ||
desc.equals("Ljavax/ejb/Stateful;")) {
includedFiles += parentPath.relativize(file.toPath())
}
return null //no interest in actually visiting the annotation values
}
},
ClassReader.SKIP_DEBUG | ClassReader.EXPAND_FRAMES | ClassReader.SKIP_FRAMES | ClassReader.SKIP_CODE
)
}
}
}
return includedFiles
}
publishing {
publications {
mypub(IvyPublication) {
artifact(ejbJar) {
name 'ejb'
}
artifact(clientEjbJar) {
name 'client-ejb'
}
}
}
repositories {
ivy {
name 'personal'
url "${ant['developer.repository']}/"
layout 'pattern', {
artifact "[organisation]/[module]/[artifact]/[revision]/[type]/[artifact]-[revision].[ext]"
ivy "[organisation]/[module]/[type]/[revision]/[type]/[type]-[revision].[ext]"
}
}
}
}
Я действительно сломал предмет в более простой форме, поскольку я думал, что это может быть ошибка Грейдл.
Упрощенная форма была:
apply plugin: 'java'
apply plugin: 'ivy-publish'
task bigJar(type: Jar) {
from "${rootDir}/src/main/resources"
include '**/*'
}
task smallJar(type: Jar) {
from "${rootDir}/src/main/resources/A/B"
include '**/*'
}
group 'ICantBeEmpty'
artifacts {
archives bigJar
archives smallJar
}
publishing {
publications {
mypub(IvyPublication) {
artifact(bigJar) { name 'biggie' }
artifact(smallJar) { name 'smallie' }
}
repositories {
ivy {
name 'personal'
url "c:/temp/gradletest"
layout 'pattern', {
artifact "[organisation]/[module]/[artifact]/[revision]/[type]/[artifact]-[revision].[ext]"
ivy "[organisation]/[module]/[type]/[revision]/[type]/[type]-[revision].[ext]"
}
}
}
}
}
Это приводит к 2 файлам в C: /temp/gradletest/ICantBeEmpty/report-bug/biggie/unspecified/biggie-unspecified.jar и с:/температурами/gradletest/ICantBeEmpty/report-bug/smallie/unpecified/smallie-unspecified.jar Оба эти файла идентичны, однако я думаю, что знаю, почему я вижу мой более поздний ответ.
спасибо за интерес, но ссылка «старый путь» показывает мне именно то, что я уже делаю в стороне от того факта, что я использую реплика плюща, а не плоский файл. Потому что что-то находится в состоянии инкубации, это не значит, что его нельзя использовать, и вопрос поднят об этом, это сущность открытого источника, развивающегося так быстро. Я действительно определил проблему сейчас, поскольку имя, используемое для поиска артефактов в конфигурации, не уникально и опубликует полное описание, чтобы сохранить других пользователей Gradle в ту же самую проблему. –