/** * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ // TODO: this is work in progress, please follow FINERACT-1171 buildscript { ext { jacocoVersion = '0.8.6' retrofitVersion = '2.9.0' okhttpVersion = '4.9.0' oltuVersion = '1.0.1' fineractJavaProjects = subprojects.findAll{ [ 'fineract-api', 'fineract-provider', 'integration-tests', 'fineract-client' ].contains(it.name) } fineractPublishProjects = subprojects.findAll{ [ 'fineract-client' ].contains(it.name) } } repositories { jcenter() maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath 'com.bmuschko:gradle-cargo-plugin:2.8.0' classpath 'org.apache.openjpa:openjpa:3.1.2' // when upgrading, also change OpenJPA version repeated in fineract-provider/build.gradle! classpath 'com.radcortez.gradle:openjpa-gradle-plugin:3.1.0' classpath 'gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.6.0' classpath 'gradle.plugin.com.github.andygoossens:gradle-modernizer-plugin:1.3.0' } } plugins { id 'io.spring.dependency-management' version '1.0.11.RELEASE' id 'com.diffplug.spotless' version '5.9.0' apply false id 'org.nosphere.apache.rat' version '0.7.0' apply false id 'com.github.hierynomus.license' version '0.15.0' apply false id 'org.openapi.generator' version '4.3.1' apply false id 'org.zeroturnaround.gradle.jrebel' version '1.1.10' apply false id 'org.springframework.boot' version '2.3.5.RELEASE' apply false id 'net.ltgt.errorprone' version '1.3.0' apply false id 'io.swagger.core.v3.swagger-gradle-plugin' version '2.1.6' apply false id 'com.gorylenko.gradle-git-properties' version '2.2.4' apply false id 'org.asciidoctor.jvm.convert' version '3.3.0' apply false id 'org.asciidoctor.jvm.pdf' version '3.3.0' apply false id 'org.asciidoctor.jvm.epub' version '3.3.0' apply false id 'org.asciidoctor.jvm.revealjs' version '3.3.0' apply false id 'org.asciidoctor.jvm.gems' version '3.3.0' apply false id 'org.asciidoctor.kindlegen.base' version '3.2.0' apply false } description = '''\ Run as: gradle clean bootRun''' project.ext.jerseyVersion = '1.19.4' ext['groovy.version'] = '3.0.6' ext['swaggerFile'] = "$rootDir/fineract-provider/build/classes/java/main/static/swagger-ui/fineract.yaml".toString() allprojects { group = 'org.apache.fineract' repositories { jcenter() } apply plugin: 'io.spring.dependency-management' apply plugin: 'com.diffplug.spotless' apply plugin: 'com.github.hierynomus.license' apply plugin: 'org.nosphere.apache.rat' apply plugin: 'project-report' // Configuration for the dependency management plugin // https://github.com/spring-gradle-plugins/dependency-management-plugin dependencyManagement { imports { mavenBom 'org.springframework:spring-framework-bom:5.3.3' mavenBom 'org.springframework.boot:spring-boot-dependencies:2.3.5.RELEASE' mavenBom 'org.junit:junit-bom:5.7.0' } dependencies { // We use fixed versions, instead of inheriting them from the Spring BOM, to be able to be on more recent ones. // We do not use :+ to get the latest available version available on Maven Central, as that could suddenly break things. // We use the Renovate Bot to automatically propose Pull Requests (PRs) when upgrades for all of these versions are available. dependency 'org.springframework.security.oauth:spring-security-oauth2:2.5.0.RELEASE' dependency 'org.apache.openjpa:openjpa:3.1.2' // when upgrading, also change OpenJPA version repeated above in buildscript! dependency 'com.google.guava:guava:30.1-jre' dependency 'com.google.code.gson:gson:2.8.6' dependency 'org.apache.commons:commons-email:1.5' dependency 'commons-io:commons-io:2.8.0' dependency 'org.drizzle.jdbc:drizzle-jdbc:1.4' dependency 'com.github.librepdf:openpdf:1.3.24' dependency 'org.mnode.ical4j:ical4j:3.0.21' dependency 'org.quartz-scheduler:quartz:2.3.2' dependency 'com.amazonaws:aws-java-sdk-s3:1.11.934' dependency 'org.ehcache:ehcache:3.9.0' dependency 'com.github.spullara.mustache.java:compiler:0.9.7' dependency 'com.jayway.jsonpath:json-path:2.5.0' dependency 'org.apache.tika:tika-core:1.25' dependency 'org.apache.httpcomponents:httpclient:4.5.13' dependency 'io.swagger.core.v3:swagger-annotations:2.1.6' dependency 'jakarta.management.j2ee:jakarta.management.j2ee-api:1.1.4' dependency 'jakarta.jms:jakarta.jms-api:2.0.3' dependency 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.3' dependency 'jakarta.validation:jakarta.validation-api:3.0.0' dependency 'org.apache.activemq:activemq-broker:5.16.1' dependency 'org.apache.bval:org.apache.bval.bundle:2.0.5' dependency 'io.github.classgraph:classgraph:4.8.90' dependency 'org.awaitility:awaitility:4.0.3' dependency 'com.github.spotbugs:spotbugs-annotations:4.2.0' dependency 'javax.cache:cache-api:1.1.1' dependency 'org.mock-server:mockserver-junit-jupiter:5.11.2' dependency 'org.webjars.npm:swagger-ui-dist:3.40.0' dependency 'org.webjars:webjars-locator-core:0.46' // fineract client dependencies dependency "com.squareup.retrofit2:retrofit:$retrofitVersion" dependency "com.squareup.retrofit2:retrofit-mock:$retrofitVersion" dependency "com.squareup.retrofit2:adapter-java8:$retrofitVersion" dependency "com.squareup.retrofit2:adapter-rxjava2:$retrofitVersion" dependency "com.squareup.retrofit2:adapter-rxjava3:$retrofitVersion" dependency "com.squareup.retrofit2:adapter-guava:$retrofitVersion" dependency "com.squareup.retrofit2:converter-wire:$retrofitVersion" dependency "com.squareup.retrofit2:converter-jackson:$retrofitVersion" dependency "com.squareup.retrofit2:converter-simplexml:$retrofitVersion" dependency "com.squareup.retrofit2:converter-jaxb:$retrofitVersion" dependency "com.squareup.retrofit2:converter-java8:$retrofitVersion" dependency "com.squareup.retrofit2:converter-scalars:$retrofitVersion" dependency "com.squareup.retrofit2:converter-gson:$retrofitVersion" dependency "com.squareup.retrofit2:converter-protobuf:$retrofitVersion" dependency "org.apache.oltu.oauth2:org.apache.oltu.oauth2.common:$oltuVersion" dependency "org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:$oltuVersion" dependency "org.apache.oltu.oauth2:org.apache.oltu.oauth2.httpclient4:$oltuVersion" dependency "com.squareup.okhttp3:okhttp:$okhttpVersion" dependency "com.squareup.okhttp3:okcurl:$okhttpVersion" dependency "com.squareup.okhttp3:logging-interceptor:$okhttpVersion" dependency "com.squareup.okhttp3:okhttp-apache:$okhttpVersion" dependency "com.squareup.okhttp3:okhttp-android-support:$okhttpVersion" dependency "com.squareup.okhttp3:okhttp-urlconnection:$okhttpVersion" dependency "com.squareup.okhttp3:okhttp-sse:$okhttpVersion" dependency "io.gsonfire:gson-fire:1.8.5" dependency "io.swagger:swagger-core:1.6.2" dependency "io.swagger:swagger-annotations:1.6.2" dependency "javax.annotation:javax.annotation-api:1.3.2" dependency "com.google.code.findbugs:jsr305:3.0.2" dependency "commons-codec:commons-codec:1.15" dependency ('org.flywaydb:flyway-core:7.0.0') { // https://issues.apache.org/jira/browse/FINERACT-1172 // https://github.com/apache/fineract/pull/1355 // https://github.com/flyway/flyway/issues/2957 // exclude conflicting non- dependencies from https://github.com/flyway/flyway/blob/master/flyway-core/pom.xml exclude 'software.amazon.awssdk:s3' } dependency ('org.dom4j:dom4j:2.1.3') { exclude 'relaxngDatatype:relaxngDatatype' // already in com.sun.xml.bind:jaxb-osgi:2.3.0.1 // FINERACT-940 && FINERACT-966 https://github.com/spotbugs/spotbugs/issues/1128 exclude 'xpp3:xpp3' exclude 'pull-parser:pull-parser' } dependencySet(group: 'com.sun.jersey', version: jerseyVersion) { entry 'jersey-core' entry 'jersey-servlet' entry 'jersey-server' entry 'jersey-json' } dependencySet(group: 'com.sun.jersey.contribs', version: jerseyVersion) { entry 'jersey-spring' entry 'jersey-multipart' } dependencySet(group: 'org.apache.poi', version: '4.1.2') { entry 'poi' entry 'poi-ooxml' entry 'poi-ooxml-schemas' } dependencySet(group: 'io.rest-assured', version: '4.3.0') { entry 'rest-assured' entry 'json-path' entry 'xml-path' } } } // Configuration for the spotless plugin // https://github.com/diffplug/spotless/tree/main/plugin-gradle spotless { format 'misc', { target '**/*.md', '**/*.properties', '**/.gitignore', '**/.openapi-generator-ignore', '**/*.yml', '**/*.xml', '**/**.json', '**/*.sql' targetExclude '**/build/**', '**/bin/**', '**/.settings/**', '**/.idea/**', '**/.gradle/**', '**/gradlew.bat' indentWithSpaces(4) endWithNewline() trimTrailingWhitespace() } groovyGradle { target '*.gradle', '**/*.gradle' targetExclude '**/build/**' greclipse() indentWithSpaces(4) endWithNewline() trimTrailingWhitespace() } lineEndings 'UNIX' } // Configuration for Gradle license plug-in // https://github.com/hierynomus/license-gradle-plugin license { header rootProject.file("$rootDir/APACHE_LICENSETEXT.md") excludes([ "**/gradlew*", "**/git.properties", "**/*.html", "**/*.mustache", "**/package-info.java", "**/keystore.jks", "**/static/swagger-ui/**", "**/api-docs/**", ]) strictCheck true } task licenseFormatBuildScripts (type:nl.javadude.gradle.plugins.license.License) { source = fileTree(dir: "$rootDir/", includes: [ '**/*.bat', '**/*.sh', '**/*.sql' ], excludes: [ '**/gradlew*' ]) } licenseFormat.dependsOn licenseFormatBuildScripts // Configuration for Apache Release Audit Tool task // https://github.com/eskatos/creadur-rat-gradle rat { verbose = false reportDir = file("$buildDir/reports/rat") excludes = [ '**/src/main/templates/**/*.mustache', '**/.dockerignore', '**/*.launch', '**/licenses/**', '**/*.md', '**/*.adoc', '**/.asciidoctorconfig', '**/*.puml', '**/*.github/**', '**/MANIFEST.MF', '**/*.json', '**/*.json.template', '**/*.txt', '**/*.log', '**/fineractdev-eclipse-preferences.epf', '**/template-expected.html', '**/template.mustache', '**/.classpath', '**/.project', '**/.idea/**', '**/*.ipr', '**/*.iws', '**/.settings/**', '**/bin/**', '**/.git/**', '**/.gitignore', '**/.openapi-generator-ignore', '**/.gitkeep', '**/*.iml', '**/config/swagger/templates/**', // Notice files '**/NOTICE_RELEASE', '**/NOTICE_SOURCE', // Swagger License '**/src/main/resources/static/swagger-ui/**', // gradle '**/.gradle/**', '**/gradlew', '**/gradlew.bat', '**/gradle/wrapper/gradle-wrapper.properties', '**/caches/**', '**/daemon/**', '**/native/**', '**/wrapper/**', '**/build/**', // Api Docs '**/api-docs/*.*', '**/docs/system-architecture/.htaccess', '**/docs/system-architecture/404.html', '**/docs/system-architecture/index.html', '**/docs/system-architecture/**/*.xml', '**/bootstrap-3.0.0/assets/application.js', '**/system-architecture/js/plugins.js', // Apache License '**/bootstrap-3.0.0/assets/less.js', '**/css/bootstrap-3.0.0/**/*.*', // Public Domain See http://www.JSON.org/js.html '**/bootstrap-3.0.0/assets/json2.js.htm', // MIT License '**/modernizr-2.6.2.min.js', '**/css/normalize.css', '**/assets/filesaver.js', '**/css/fonts/glyphicons-halflings-regular.svg', '**/assets/jszip.js', '**/assets/jquery.js', '**/api-docs/jquery-1.7.min.js', '**/css/toc-0.1.2/**/*.*', '**/docs/system-architecture/css/main.css', '**/system-architecture/js/vendor/jquery-1.9.1.min.js', '**/system-architecture/js/vendor/toc-0.1.2/jquery.toc.min.js', '**/assets/respond.min.js', '**/assets/html5shiv.js', // BSD License '**/assets/uglify.js', // Ignore out folder '**/out/**', // Git build info "**/git.properties", ".mailmap", ] } } configure(project.fineractJavaProjects) { // NOTE: order matters! apply plugin: 'java-library' apply plugin: 'idea' apply plugin: 'eclipse' apply plugin: 'checkstyle' apply plugin: 'jacoco' apply plugin: "net.ltgt.errorprone" apply plugin: "com.github.spotbugs" apply plugin: 'com.github.andygoossens.gradle-modernizer-plugin' /* define the valid syntax level for source files */ sourceCompatibility = JavaVersion.VERSION_11 /* define binary compatibility version */ targetCompatibility = JavaVersion.VERSION_11 /* http://stackoverflow.com/questions/19653311/jpa-repository-works-in-idea-and-production-but-not-in-gradle */ sourceSets.main.output.resourcesDir = sourceSets.main.java.outputDir sourceSets.test.output.resourcesDir = sourceSets.test.java.outputDir configurations { implementation.setCanBeResolved(true) api.setCanBeResolved(true) } tasks.withType(JavaCompile) { options.compilerArgs += [ "-Xlint:unchecked", "-Xlint:cast", "-Xlint:auxiliaryclass", "-Xlint:deprecation", "-Xlint:dep-ann", "-Xlint:divzero", "-Xlint:empty", "-Xlint:exports", "-Xlint:fallthrough", "-Xlint:finally", "-Xlint:module", "-Xlint:opens", "-Xlint:options", "-Xlint:overloads", "-Xlint:overrides", "-Xlint:path", "-Xlint:processing", "-Xlint:removal", "-Xlint:requires-automatic", "-Xlint:requires-transitive-automatic", "-Xlint:try", "-Xlint:varargs", "-Xlint:preview", "-Xlint:static", "-Werror" ] // TODO FINERACT-959 (gradually) enable -Xlint:all (see "javac -help -X") options.deprecation = true options.compilerArgs +=[ "-Xmaxwarns", 1500, "-Xmaxerrs", 1500 ] } // Configuration for the spotless plugin // https://github.com/diffplug/spotless/tree/main/plugin-gradle dependencies { spotbugsPlugins 'jp.skypencil.findbugs.slf4j:bug-pattern:1.5.0@jar' spotbugs 'com.github.spotbugs:spotbugs:4.2.0' } spotless { java { targetExclude '**/build/**', '**/bin/**', '**/out/**' importOrder() //sort imports alphabetically removeUnusedImports() eclipse().configFile "$rootDir/config/fineractdev-formatter.xml" endWithNewline() trimTrailingWhitespace() // Enforce style modifier order custom 'Modifier ordering', { def modifierRanking = [ public : 1, protected : 2, private : 3, abstract : 4, default : 5, static : 6, final : 7, transient : 8, volatile : 9, synchronized: 10, native : 11, strictfp : 12] // Find any instance of multiple modifiers. Lead with a non-word character to avoid // accidental matching against for instance, "an alternative default value" it.replaceAll(/\W(?:public |protected |private |abstract |default |static |final |transient |volatile |synchronized |native |strictfp ){2,}/, { // Do not replace the leading non-word character. Identify the modifiers it.replaceAll(/(?:public |protected |private |abstract |default |static |final |transient |volatile |synchronized |native |strictfp ){2,}/, { // Sort the modifiers according to the ranking above it.split().sort({ modifierRanking[it] }).join(' ') + ' ' } ) } ) } } lineEndings 'UNIX' } compileJava.dependsOn spotlessCheck // If we are running Gradle within Eclipse to enhance classes with OpenJPA, // set the classes directory to point to Eclipse's default build directory if (project.hasProperty('env') && project.getProperty('env') == 'eclipse') { sourceSets.main.java.outputDir = file("$projectDir/bin/main") } // Configuration for the Checkstyle plugin // https://docs.gradle.org/current/userguide/checkstyle_plugin.html dependencies { checkstyle 'com.puppycrawl.tools:checkstyle:8.38' checkstyle 'com.github.sevntu-checkstyle:sevntu-checks:1.38.0' } // Configuration for JaCoCo code coverage task // https://www.eclemma.org/jacoco/ jacoco { toolVersion = jacocoVersion reportsDir = file("$buildDir/reports/jacoco") } jacocoTestReport { reports { html.enabled=true xml.enabled=true html.destination file("${buildDir}/code-coverage") } } // Configuration for the errorprone plugin // https://github.com/tbroyer/gradle-errorprone-plugin dependencies { errorprone "com.google.errorprone:error_prone_core:2.4.0" } tasks.withType(JavaCompile) { options.errorprone { disableWarningsInGeneratedCode = true excludedPaths = ".*/build/.*" //Todo Remove necessary checks from this list disable( "UnusedVariable", "TypeParameterUnusedInFormals", "JdkObsolete", "EmptyBlockTag", "MissingSummary", "InvalidParam", "ReturnFromVoid", "AlmostJavadoc", "InvalidBlockTag", ) //TODO gradually enable these checks error( "DefaultCharset", "RemoveUnusedImports", "WaitNotInLoop", "ThreeLetterTimeZoneID", "VariableNameSameAsType", "UnnecessaryParentheses", "MultipleTopLevelClasses", "MixedMutabilityReturnType", "MultiVariableDeclaration", "AssertEqualsArgumentOrderChecker", "EmptySetMultibindingContributions", "BigDecimalEquals", "MixedArrayDimensions", "PackageLocation", "UseBinds", "BadImport", "IntLongMath", "FloatCast", "ReachabilityFenceUsage", "StreamResourceLeak", "TruthIncompatibleType", "ByteBufferBackingArray", "SameNameButDifferent", "OrphanedFormatString", "CatchAndPrintStackTrace", "ObjectToString", "StringSplitter", "AssertThrowsMultipleStatements", "BoxedPrimitiveConstructor", "EmptyCatch", "BoxedPrimitiveEquality", "SynchronizeOnNonFinalField", "WildcardImport", "FutureReturnValueIgnored", "PrivateConstructorForNoninstantiableModule", "ClassCanBeStatic", "ClassNewInstance", "UnnecessaryStaticImport", "UnsafeFinalization", "JavaTimeDefaultTimeZone", "JodaPlusMinusLong", "MutableMethodReturnType", "SwitchDefault", "VarTypeName", "ArgumentSelectionDefectChecker", "CompareToZero", "InjectOnConstructorOfAbstractClass", "ImmutableEnumChecker", "NarrowingCompoundAssignment", "MissingCasesInEnumSwitch", "ReferenceEquality", "UndefinedEquals", "PublicConstructorForAbstractClass", "UnescapedEntity", "ModifyCollectionInEnhancedForLoop", "NonCanonicalType", "InvalidInlineTag", "MutablePublicArray", "StaticAssignmentInConstructor", "ProtectedMembersInFinalClass", "OperatorPrecedence", "EqualsGetClass", "EqualsUnsafeCast", "DoubleBraceInitialization", "UnnecessaryDefaultInEnumSwitch", "UnusedNestedClass", "UnusedMethod", "ModifiedButNotUsed", "InconsistentCapitalization", "MissingOverride", // "InvalidBlockTag", // "InconsistentOverloads", // "MethodCanBeStatic", // "Var", // "ConstantField", // "UnnecessaryDefaultInEnumSwitch", // "FieldCanBeFinal" ) } } test { useJUnitPlatform() testLogging { // FINERACT-927 events "skipped", "failed" showStandardStreams = false exceptionFormat "full" } } // Configuration for spotbugs plugin // https://github.com/spotbugs/spotbugs-gradle-plugin // To generate an HTML report instead of XML spotbugs { reportLevel = 'high' showProgress = true } // https://github.com/spotbugs/spotbugs-gradle-plugin/issues/242 spotbugsMain { reports { html { enabled = true stylesheet = 'fancy-hist.xsl' } } } spotbugsTest { reports { html { enabled = true stylesheet = 'fancy-hist.xsl' } } } // Configuration for https://github.com/andygoossens/gradle-modernizer-plugin modernizer { includeTestClasses = true failOnViolations = true violationLogLevel="error" javaVersion = project.targetCompatibility ignoreGeneratedClasses = true } } configure(project.fineractPublishProjects) { apply plugin: 'maven' apply plugin: 'maven-publish' publishing { publications { mavenJava(MavenPublication) { from components.java versionMapping { usage('java-api') { fromResolutionOf('runtimeClasspath') } usage('java-runtime') { fromResolutionResult() } } pom { name = 'Fineract' description = 'A secure, multi-tenanted microfinance platform' url = 'https://fineract.apache.org' licenses { license { name = 'The Apache License, Version 2.0' url = 'http://www.apache.org/licenses/LICENSE-2.0.html' } } scm { connection = 'scm:git:https://github.com/apache/fineract.git' developerConnection = 'scm:git:git://github.com:apache/fineract.git' url = 'https://fineract.apache.org/' } } } } // TODO FINERACT-1102: Actually use this to deploy to ASF (Apache Software Foundation) Nexus Maven Repository } }