gradle-aspectj-binary
gradle-aspectj-binary copied to clipboard
Gradle plugin for AspectJ binary weaving
gradle-aspectj-binary
Disclamer: I don't use this plugin in my projects anymore and currently don't plan to support it in foreseeable future. In general, it works well but a bit outdated (Gradle, AspectJ versions). Feel free to fork it and adopt for your needs.
Gradle plugin for AspectJ binary weaving. It works similar to https://github.com/jcabi/jcabi-maven-plugin doing the weaving on the weaving over already compiled classes. It is particularly helpful if the source code is written in a language different from Java. For example, Kotlin, as it produces fully compatible Java bytecode. It goes without saying that the plugin works for Java sources as well.
Requirements
- The plugin uses AspectJ 1.9.2 for generating the bytecode. Please read there about supported JDK versions.
- The plugin itself is compiled with
openjdk8, so it requires JDK 8 or above to work. - The plugin uses Gradle 4.9 API so you need Gradle of that version or newer
Usage
Here is an example project in the examples folder. Basically you need to add the plugin to your build script
buildscript {
repositories {
jcenter()
}
dependencies {
classpath "com.github.sedovalx.gradle:gradle-aspectj-binary:$pluginVersion"
}
}
apply plugin: 'com.github.sedovalx.gradle-aspectj-binary'
weaveClasses task becomes available after that. By default, if the java plugin is not disabled via
configuration (see below), there are pre-configured tasks dependencies:
weaveClasses.dependsOn compileJava
classes.dependsOn weaveClasses
so you can just run the build and have all your aspects in the main source set applied.
You need to weave both aspects and classes where aspects should be applied. So if you have aspect classes in a project A and classes to be weaved in a project B you should add the
weaveClassestask to the build process of both projects. See theexamplesproject for details.
Available configuration
The plugins can be configured with the following parameters
aspectjBinary {
applyJavaPlugin = true
weaveClasses {
ajcSourceSets = [project.sourceSets.main]
outputDir = project.file(...)
source = '1.7'
target = '1.7'
additionalAjcParams = ['-proceedOnError']
writeToLog = true
}
}
Parameters:
applyJavaPluginshould thejavaplugin be applied with theaspectjBinaryplugin. By default, it is applied but in some cases, for example Android projects, it is not desired. WARN: in this case, you must provide theajcSourceSetsand theoutputDirproperty values by yourself as there is no default configuration for Android projects (any help is appreciated).ajcSourceSetsis a set of Gradle source sets to be weaved. By default, it includes themainsource set only. BothcompileClasspathandruntimeClasspathcollections are extracted from each source set.outputDiris a folder where the weaved classes are copied. By default, it isbuild/classes/java/main.sourcehas '1.7' as default value and is passed as it is to the ajc compiler parametertargethas '1.7' as default value and is passed as it is to the ajc compiler parameteradditionalAjcParamsallows addition of arbitrary entries to the tail of the default AJC parameterswriteToLoghasfalseas a default value and defines if ajc's compile messages should affect the build process. In case of value istrueall the messages are written in thebuild/ajc.logfile and do not affect the build result. Otherwise, error or warning messages are printed in the build output and ajc errors (if any) break the build process.
Clean local build
The examples project depends on a version of the plugin. In case of a clean build no plugin version exists in the repository. So I use a little bit hacky way to do the trick.
$ echo "include 'plugin'" > settings.gradle
$ ./gradlew clean :plugin:publishMavenJavaPublicationToMavenLocal
$ echo "include 'plugin', 'examples', 'examples:aspects', 'examples:app'" > settings.gradle
$ ./gradlew :examples:app:run