How to package dependencies in a Grails 3 plugin using gradle? - java

I'm having difficulty generating a Grails 3.2.7 plugin with its dependencies.
This works and creates a JAR with all dependencies:
gradle clean build
..but not this; the JAR has no dependencies, just plugin project files:
gradle publishToMavenLocal
My gradle file, I know there's something missing, and based on the docs it's my understand there's no native feature to do this.
buildscript {
ext {
grailsVersion = project.grailsVersion
}
repositories {
mavenLocal()
maven { url "https://repo.grails.org/grails/core" }
jcenter()
}
dependencies {
classpath "org.grails:grails-gradle-plugin:$grailsVersion"
classpath "org.jfrog.buildinfo:build-info-extractor-gradle:3.0.1"
}
}
plugins {
id "io.spring.dependency-management" version "0.5.2.RELEASE"
id "com.jfrog.bintray" version "1.2"
}
version "3.1-SNAPSHOT"
group "mygroup"
apply plugin: 'eclipse'
apply plugin: 'idea'
apply plugin: "org.springframework.boot"
apply plugin: "com.jfrog.artifactory"
apply plugin: "org.grails.grails-plugin"
apply plugin: "org.grails.grails-gsp"
apply plugin: 'maven-publish'
ext {
grailsVersion = project.grailsVersion
gradleWrapperVersion = project.gradleWrapperVersion
}
sourceCompatibility = 1.8
targetCompatibility = 1.8
idea {
module {
downloadSources = true
}
}
repositories {
mavenLocal()
mavenCentral()
maven { url "https://repo.grails.org/grails/core" }
}
dependencyManagement {
imports {
mavenBom "org.grails:grails-bom:$grailsVersion"
}
applyMavenExclusions false
}
dependencies {
provided 'org.springframework.boot:spring-boot-starter-logging'
provided "org.springframework.boot:spring-boot-starter-actuator"
provided "org.springframework.boot:spring-boot-autoconfigure"
provided "org.springframework.boot:spring-boot-starter-tomcat"
provided "org.grails:grails-web-boot"
provided "org.grails:grails-dependencies"
provided 'javax.servlet:javax.servlet-api:3.1.0'
compile "org.grails:grails-plugin-testing"
testCompile "com.fiftyonred:mock-jedis:0.4.0"
console "org.grails:grails-console"
compile "redis.clients:jedis:2.5.2"
}
task wrapper(type: Wrapper) {
gradleVersion = gradleWrapperVersion
}
artifactory {
contextUrl = 'http://myrepo/'
}
task sourceJar(type: Jar) {
from sourceSets.main.allJava
}
publishing {
publications {
mavenJava(MavenPublication) {
from components.java
}
}
}

The issue stems from the publishing section:
When I change this to:
task jarWithPlainPom(type: Jar) {
from sourceSets.main.output
from configurations.runtime
}
publishing {
publications {
mavenJava(MavenPublication) {
artifact jarWithPlainPom
}
}
}
It includes most of the needed dependencies, however the POM is not updated and the project fails when importing the plugin.

Related

Adding dependency causes main class to not be found

When adding the com.spotify:docker-client:3.5.12 dependency to build.gradle, it causes my main class "com.gamedash.daemon.Main" to not be found. I have absolutely no clue what this might be causing. Removing the dependency resolves the issue.
build.gradle
group 'com.gamedash.daemon'
version '0.1'
apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'eclipse'
apply plugin: 'idea'
sourceCompatibility = 9
targetCompatibility = 9
repositories {
mavenCentral()
maven {
url 'https://jetbrains.bintray.com/pty4j'
}
}
application {
mainClassName = 'com.gamedash.daemon.Main'
}
jar {
manifest {
attributes(
'Main-Class': 'com.gamedash.daemon.Main'
)
}
from {
configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
}
}
sourceSets {
main {
resources {
srcDirs "src/main/resources", "src/main/configs"
}
}
}
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'net.sf.proguard:proguard-gradle:6.2.2'
}
}
dependencies {
implementation('me.tongfei:progressbar:0.7.4')
implementation('com.google.guava:guava:28.2-jre')
implementation('com.corundumstudio.socketio:netty-socketio:1.7.17')
implementation('org.jetbrains.pty4j:pty4j:0.8.6')
implementation('commons-io:commons-io:2.6')
implementation('org.zeroturnaround:zt-zip:1.13')
implementation('org.apache.httpcomponents:httpclient:4.5.8')
implementation('com.beust:jcommander:1.78')
implementation('com.google.code.gson:gson:2.8.5')
implementation('com.github.oshi:oshi-core:4.4.2')
implementation('net.java.dev.jna:jna:5.3.1')
implementation('net.java.dev.jna:jna-platform:5.3.1')
implementation('org.apache.commons:commons-lang3:3.9')
implementation('com.sparkjava:spark-core:2.9.1')
implementation('org.slf4j:slf4j-api:1.7.6')
implementation('org.slf4j:slf4j-log4j12:1.7.5')
implementation('org.apache.mina:mina-core:2.0.0-M2')
implementation('org.apache.ftpserver:ftplet-api:1.1.1')
implementation('org.apache.ftpserver:ftpserver-core:1.1.1')
implementation('org.apache.sshd:sshd-core:2.4.0')
implementation('org.apache.sshd:sshd-sftp:2.4.0')
compile('com.spotify:docker-client:3.5.12:shaded')
implementation('org.beryx:text-io:3.3.0')
implementation('com.fasterxml.jackson.core:jackson-core:2.9.8')
implementation('com.fasterxml.jackson.core:jackson-annotations:2.9.8')
implementation('com.fasterxml.jackson.core:jackson-databind:2.9.8')
compile group: 'javax.xml.bind', name: 'jaxb-api', version: '2.2.4'
implementation group: 'commons-validator', name: 'commons-validator', version: '1.4.0'
implementation files('lib/icmp4j-all.jar')
implementation files('lib/Schokker-IT-Rest-Client.jar')
implementation files('lib/com.gamedash.daemon.common.jar')
}
task obfuscate(type: proguard.gradle.ProGuardTask) {
configuration 'proguard.txt'
injars "build/libs/gamedash-daemon-${ version }.jar"
outjars "build/libs/gamedash-daemon-${ version }-obfuscated.jar"
}
Turns out that the library in question uses Bouncycastle and thus requires a signed jar to run. Would have been much more pleasant if the error message would have said so, instead of telling me that the class was not found.
Fixed it by adding the following rule to my build.gradle
exclude 'META-INF/*.RSA', 'META-INF/*.SF','META-INF/*.DSA'

Sonar with multi-module gradle project

I have java and kotlin based multi module gradle project. I am trying to setup sonar analysis for the same. I configured sonar at root project and ran analysis with CircleCI. The result in sonarcloud gets for only one of the sub-project.
My project structure is as below:
projectA/build.gradle
ProjectB/build.gradle
ProjectC/build.gradle
build.gradle
Here is my root build.gradle.
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61'
classpath 'io.spring.gradle:dependency-management-plugin:1.0.9.RELEASE'
classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.2.4.RELEASE'
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.7"
}
}
ext {
springCloudVersion = 'Hoxton.SR1'
springBootVersion = '2.2.4.RELEASE'
}
configurations.all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
allprojects {
group = 'com.organiz'
version = '1.0.0-SNAPSHOT'
repositories {
mavenCentral()
maven {
// url ="s3url" // only for releases
url ="s3url" // only for snapshots
credentials(AwsCredentials) {
accessKey project.accessKey
secretKey project.secretKey
}
}
}
}
subprojects {
apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'org.springframework.boot'
apply plugin: 'idea'
apply plugin: 'org.sonarqube'
sourceCompatibility = '1.8'
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
implementation('someappcommon:1.0.0-SNAPSHOT') { changing = true }
implementation("com.h2database:h2:1.4.200")
}
repositories {
mavenCentral()
jcenter()
maven {
url "someurlhere"
}
someappMavenRepoUrl.split(',').each { repoUrl -> maven { url repoUrl } }
}
test {
useJUnitPlatform()
}
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
sonarqube {
properties {
property "sonar.projectKey", "projectKey"
property "sonar.organization", "org"
property "sonar.host.url", "https://sonarcloud.io"
property "sonar.verbose", "true"
}
}
}
project(':project1') {
dependencies {
implementation project(":common")
}
}
project(':project2') {
dependencies {
implementation project(":common")
}
}
Need to include sonarqube outside the subproject block and then all the sub modules will be analysed and report will be exported.
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.61'
classpath 'io.spring.gradle:dependency-management-plugin:1.0.9.RELEASE'
classpath 'org.springframework.boot:spring-boot-gradle-plugin:2.2.4.RELEASE'
classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.7"
}
}
ext {
springCloudVersion = 'Hoxton.SR1'
springBootVersion = '2.2.4.RELEASE'
}
configurations.all {
resolutionStrategy.cacheChangingModulesFor 0, 'seconds'
}
allprojects {
group = 'com.organiz'
version = '1.0.0-SNAPSHOT'
repositories {
mavenCentral()
maven {
// url ="s3url" // only for releases
url = "s3url" // only for snapshots
credentials(AwsCredentials) {
accessKey project.accessKey
secretKey project.secretKey
}
}
}
}
apply plugin: 'org.sonarqube'
sonarqube {
properties {
property "sonar.projectKey", "projectKey"
property "sonar.organization", "org"
property "sonar.host.url", "https://sonarcloud.io"
property "sonar.verbose", "true"
}
}
subprojects {
apply plugin: 'java'
apply plugin: 'kotlin'
apply plugin: 'org.springframework.boot'
apply plugin: 'idea'
sourceCompatibility = '1.8'
dependencies {
implementation 'org.springframework.boot:spring-boot-starter'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8'
implementation('someappcommon:1.0.0-SNAPSHOT') { changing = true }
implementation("com.h2database:h2:1.4.200")
}
repositories {
mavenCentral()
jcenter()
maven {
url "someurlhere"
}
someappMavenRepoUrl.split(',').each { repoUrl -> maven { url repoUrl } }
}
test {
useJUnitPlatform()
}
compileKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
compileTestKotlin {
kotlinOptions {
jvmTarget = "1.8"
}
}
}
project(':project1') {
dependencies {
implementation project(":common")
}
}
project(':project2') {
dependencies {
implementation project(":common")
}
}
My solution for kotlin multi-module project with junit 5 & spring boot, using gradle-jacoco-log plugin:
1.☝🏻 In your root build.gradle.kts:
plugins {
kotlin("jvm") version "1.5.0"
id("org.sonarqube") version "3.2.0"
id ("org.barfuin.gradle.jacocolog") version "1.2.4"
}
sonarqube {
val sonarOrganization: String by project
val sonarProjectKey: String by project
val sonarLogin: String by project
properties {
properties(
hashMapOf<String, String>(
"sonar.login" to sonarLogin,
"sonar.projectKey" to sonarProjectKey,
"sonar.organization" to sonarOrganization,
"sonar.host.url" to "https://sonarcloud.io",
"sonar.coverage.jacoco.xmlReportPaths" to "${buildDir}/reports/jacoco/jacocoAggregatedReport/jacocoAggregatedReport.xml"
)
)
}
}
2.👉🏻 In backend suprojects which have tests:
plugins{
jacoco
}
jacoco { toolVersion = "0.8.7" }
tasks{
test { useJUnitPlatform()
jacocoTestReport { reports { xml.required.set( true ) } }
finalizedBy(jacocoTestReport)
}
}
Optional step (example how to use)
3.👌🏻 In your CI file (.github/workflows/master.yml in my case):
name: Master CI
on:
push:
branches:
- master
jobs:
DEPLOY:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout#v2
- name: 🪜 Set up JDK 16
uses: actions/setup-java#v1
with:
java-version: 16
- name: 🔦 Test
run: |
chmod +x ./gradlew
./gradlew test
# Create `build/jacoco/jacocoMergeSubprojects.exec`
- name: ⛈ 1) Jacoco merge subprojects reports
run: ./gradlew jacocoMergeSubprojects -x test
# Create `build/reports/jacoco/jacocoAggregatedReport/jacocoAggregatedReport.xml`
- name: ⛈ 2) Jacoco Jacoco aggregated report
run: ./gradlew jacocoAggregatedReport -x test
- name: ⛈ 3) Sonarqube report
run: ./gradlew sonarqube -x test
env:
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

gradle create dependency for maven, build fails

I want to create a sample dependency from project in gradle to project to maven
apply plugin: "maven-publish"
apply plugin: "java"
repositories {
mavenLocal()
}
sourceSets {
main {
java {
srcDirs 'java'
}
resources {
srcDirs 'build'
}
}
}
task sourcesJar(type: Jar) {
from 'build/libs'
classifier = 'sources'
}
publishing {
publications {
maven(MavenPublication) {
groupId = 'or.gradle.sample'
artifactId = 'sort-array'
version = '1.1'
artifact sourcesJar
}
}
repositories {
mavenLocal()
}
}
but when I type:
gradle publishToMavenLocal
I have in log :
... Publishing to repository null ....
and BUILD FAIL

Publishing libgdx core to artifactory

I'm am trying to publish an in-house libGDX framework to use for all the games I work on using artifactory. I have been following this guide, however, I am stuck at the point in which the project itself is actually published. My libGDX project only has a core module, as it is not a game in itself, so I did not make a desktop or android module. This is my buildscript for the whole project
buildscript {
repositories {
mavenLocal()
mavenCentral()
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
jcenter()
}
dependencies {
classpath "org.jfrog.buildinfo:build-info-extractor-gradle:latest.release"
}
}
allprojects {
apply plugin: "eclipse"
apply plugin: "idea"
version = '1.0'
ext {
appName = "lichengine"
gdxVersion = '1.9.8'
roboVMVersion = '2.3.3'
box2DLightsVersion = '1.4'
ashleyVersion = '1.7.0'
aiVersion = '1.8.0'
}
repositories {
mavenLocal()
mavenCentral()
maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
maven { url "https://oss.sonatype.org/content/repositories/releases/" }
}
}
project(":core") {
apply plugin: "java"
dependencies {
compile group: 'org.json', name: 'json', version: '20160810'
compile "com.badlogicgames.gdx:gdx:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-freetype:$gdxVersion"
compile "com.badlogicgames.gdx:gdx-controllers:$gdxVersion"
}
}
tasks.eclipse.doLast {
delete ".project"
}
And here is the buildscript for the core module
apply plugin: "java"
apply plugin: 'com.jfrog.artifactory'
apply plugin: 'maven-publish'
sourceCompatibility = 1.7
[compileJava, compileTestJava]*.options*.encoding = 'UTF-8'
sourceSets.main.java.srcDirs = [ "src/" ]
eclipse.project {
name = appName + "-core"
}
def libraryGroupId = 'my.com.lichengine'
def libraryArtifactId = 'lichengine'
def libraryVersion = '1.0'
publishing {
publications {
aar(MavenPublication) {
groupId libraryGroupId
version libraryVersion
artifactId libraryArtifactId
artifact("$buildDir/publications/aar/${artifactId}-release.aar")
}
}
}
artifactory {
contextUrl = 'http://mywebsite.com:8081/artifactory'
publish {
repository {
repoKey = 'libs-release-local'
username = artifactory_username
password = artifactory_password
}
defaults {
publications('aar')
publishArtifacts = true
properties = ['qa.level': 'basic', 'q.os': 'android', 'dev.team': 'core']
publishPom = true
}
}
}
When I try to run the artifactoryPublish task on the root project or the core project I get the following error:
lichengine\core\build\publications\aar\lichengine-release.aar' does not exist, and need to be published from publication aar
Am I missing something? Everything I search for online is specifically for android libraries so nothing really helps.It seems like an aar file that is supposed to be generated is not.
After a lot of pain, I figured it out. Instead of using an aar publication I am using mavenJava. Here is my updated publications block:
publications {
mavenJava(MavenPublication) {
groupId libraryGroupId
version libraryVersion
artifactId libraryArtifactId
from components.java
}
}
I also had to update the defaults block
defaults {
publications ('mavenJava')
publishArtifacts = true
properties = ['qa.level': 'basic', 'q.os': 'android', 'dev.team': 'core']
publishPom = false
}
Hopefully, anyone who sees this can use this to help them make libGDX libraries with artifactory!

Querydsl error on deploy heroku

I have a Springboot application using gradle that builds fine on my local machine, but when i try to deploy it on heroku i get the following output:
FAILURE: Build failed with an exception.
* Where:
Build file '/tmp/build_67ca1dce3ca8263f014681c911e8b92e/build.gradle' line: 24
* What went wrong:
A problem occurred evaluating root project 'build_67ca1dce3ca8263f014681c911e8b92e'.
> Could not generate a proxy class for class com.ewerk.gradle.plugins.tasks.QuerydslCompile.
Does anyone have any ideia on what the problem is?
Below is the build.gradle:
buildscript {
ext {
springBootVersion = '1.2.5.RELEASE'
}
repositories {
mavenCentral()
maven {
url "https://plugins.gradle.org/m2/"
}
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath("io.spring.gradle:dependency-management-plugin:0.5.2.RELEASE")
classpath "gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:1.0.4"
classpath("org.flywaydb:flyway-gradle-plugin:3.1")
classpath "info.robotbrain.gradle.lombok:lombok-gradle:1.1"
}
}
apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'spring-boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: "com.ewerk.gradle.plugins.querydsl"
apply plugin: 'flyway'
apply plugin: "info.robotbrain.lombok"
// Profile
def env = hasProperty('profile') ? profile : 'dev'
apply from: "${env}.gradle"
// QueryDSL
querydsl {
jpa = true
}
jar {
baseName = 'web-server'
version = '0.0.1-SNAPSHOT'
}
repositories {
mavenLocal()
mavenCentral()
}
dependencies {
//Spring Boot
compile("org.springframework.boot:spring-boot-starter-web") {
exclude module: "spring-boot-starter-tomcat"
exclude module: "spring-boot-starter-logging"
}
compile("org.springframework.boot:spring-boot-starter-jetty")
compile("org.springframework.boot:spring-boot-starter-log4j")
compile("org.springframework.boot:spring-boot-starter-data-jpa")
// QueryDSL
compile("com.mysema.querydsl:querydsl-jpa:3.6.1")
// PostGreSQL
compile("org.postgresql:postgresql:9.4-1202-jdbc42")
// Guava
compile("com.google.guava:guava:18.0")
//Quartz-Scheduler
compile("org.quartz-scheduler:quartz:2.2.1")
//Spring
compile('org.springframework:spring-beans:4.2.1.RELEASE')
compile('org.springframework:spring-context:4.2.1.RELEASE')
compile('org.springframework:spring-context-support:4.2.1.RELEASE')
compile('org.springframework:spring-core:4.2.1.RELEASE')
compile group: 'org.springframework.boot', name: 'spring-boot-starter-security'
//Mail
compile('javax.mail:javax.mail-api:1.5.4')
compile('com.sun.mail:javax.mail:1.5.4')
//Lombok
compile('org.projectlombok:lombok-maven:1.16.6.1')
//Security
compile('org.springframework.security.oauth:spring-security-oauth2:2.0.8.RELEASE')
compile('javax.ws.rs:javax.ws.rs-api:2.0-m01')
//Guice
compile('com.google.inject:guice:3.0')
//Jersey
compile('com.sun.jersey:jersey-bundle:1.18')
//Dozer
compile('net.sf.dozer:dozer:5.5.1')
//Flyway API
compile "org.flywaydb:flyway-core:3.2.1"
testCompile("org.springframework.boot:spring-boot-starter-test")
testCompile("com.github.springtestdbunit:spring-test-dbunit:1.2.1")
testCompile("org.dbunit:dbunit:2.5.0")
testCompile('com.jayway.jsonpath:json-path:2.0.0')
testCompile('com.fasterxml.jackson.core:jackson-databind:2.3.1')
testCompile("com.mysema.querydsl:querydsl-jpa:3.6.1")
configurations.all {
exclude module: 'slf4j-log4j12'
}
}
task wrapper(type: Wrapper) {
gradleVersion = '2.3'
}
springBoot {
mainClass = 'net.xendurance.webServer.configuration.WebServerApplication'
}
task stage {
dependsOn installDist
}

Categories