From 6ce0bdf71e76a14e6aedd44cb3987185816fc642 Mon Sep 17 00:00:00 2001 From: Dmitry Jemerov Date: Wed, 13 Apr 2016 21:12:51 +0200 Subject: Shade Dokka's dependencies in fatjar. Resolves #46 --- core/build.gradle | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 75 insertions(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 42fa30e1..22fe2668 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -1,3 +1,9 @@ +import com.github.jengelman.gradle.plugins.shadow.relocation.Relocator +import com.github.jengelman.gradle.plugins.shadow.transformers.ServiceFileTransformer +import groovy.xml.XmlUtil +import org.apache.tools.zip.ZipEntry +import org.apache.tools.zip.ZipOutputStream + import javax.tools.ToolProvider group 'org.jetbrains.dokka' @@ -6,7 +12,7 @@ version dokka_version buildscript { dependencies { classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" - classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.2' + classpath 'com.github.jengelman.gradle.plugins:shadow:1.2.3' } repositories { jcenter() @@ -76,6 +82,60 @@ jar { } } +class PluginXmlTransformer implements com.github.jengelman.gradle.plugins.shadow.transformers.Transformer { + private Map transformedPluginXmlFiles = new HashMap<>(); + + @Override + boolean canTransformResource(FileTreeElement fileTreeElement) { + return fileTreeElement.relativePath.segments.contains("META-INF") && fileTreeElement.name.endsWith(".xml") + } + + @Override + void transform(String path, InputStream inputStream, List relocators) { + Node node = new XmlParser().parse(inputStream) + relocateXml(node, relocators) + transformedPluginXmlFiles.put(path, node) + } + + @Override + boolean hasTransformedResource() { + return !transformedPluginXmlFiles.isEmpty() + } + + @Override + void modifyOutputStream(ZipOutputStream zipOutputStream) { + for (Map.Entry entry : transformedPluginXmlFiles.entrySet()) { + zipOutputStream.putNextEntry(new ZipEntry(entry.key)) + XmlUtil.serialize(entry.value, zipOutputStream) + } + } + + private static void relocateXml(Node node, List relocators) { + Map attributes = node.attributes() + for (Map.Entry entry : attributes.entrySet()) { + entry.setValue(relocateClassName((String) entry.getValue(), relocators)) + } + List localText = node.localText() + if (localText.size() == 1) { + node.setValue(relocateClassName(localText[0], relocators)) + } + node.children().each { + if (it instanceof Node) { + relocateXml((Node) it, relocators) + } + } + } + + private static String relocateClassName(String className, List relocators) { + for (Relocator relocator : relocators) { + if (relocator.canRelocateClass(className)) { + return relocator.relocateClass(className) + } + } + return className + } +} + shadowJar { baseName = 'dokka-fatjar' classifier = '' @@ -83,6 +143,20 @@ shadowJar { dependencies { exclude(dependency('org.apache.ant:ant:1.9.6')) } + + relocate 'com', 'dokkacom' + relocate('org', 'dokkaorg') { + exclude 'org.jetbrains.dokka.**' + exclude 'org.xml.**' + } + + transform(ServiceFileTransformer) + transform(PluginXmlTransformer) + + exclude 'colorScheme/**' + exclude 'fileTemplates/**' + exclude 'inspectionDescriptions/**' + exclude 'intentionDescriptions/**' } publishing { -- cgit