import org.apache.tools.ant.taskdefs.condition.Os import org.gradle.internal.logging.ConsoleRenderer buildscript { repositories { gradlePluginPortal() } dependencies { classpath 'com.google.protobuf:protobuf-gradle-plugin:0.8.17' classpath 'com.google.gradle:osdetector-gradle-plugin:1.7.3' classpath 'com.github.johnrengelman:shadow:8.1.1' classpath 'org.springframework.boot:spring-boot-gradle-plugin:3.2.3' classpath 'com.gradle:gradle-enterprise-gradle-plugin:3.16.1' // added for windows build verification-metadata.xml error } } configure(rootProject) { // remove the 'haveno-*' scripts and 'lib' dir generated by the 'installDist' task task clean { doLast { delete fileTree(dir: rootProject.projectDir, include: 'haveno-*'), 'lib' } } } configure(subprojects) { apply plugin: 'java' apply plugin: 'com.google.osdetector' // Apply the jacoco plugin to add support for test coverage apply plugin: 'jacoco' apply plugin: 'jacoco-report-aggregation' apply plugin: 'checkstyle' sourceCompatibility = JavaVersion.VERSION_21 ext { // in alphabetical order bcVersion = '1.63' bitcoinjVersion = '2a80db4' codecVersion = '1.13' cowwocVersion = '1.2' easybindVersion = '1.0.3' easyVersion = '4.0.1' findbugsVersion = '3.0.2' firebaseVersion = '6.2.0' fontawesomefxVersion = '8.0.0' fontawesomefxCommonsVersion = '9.1.2' fontawesomefxMaterialdesignfontVersion = '2.0.26-9.1.2' grpcVersion = '1.42.1' gsonVersion = '2.8.5' guavaVersion = '32.1.1-jre' guiceVersion = '7.0.0' moneroJavaVersion = '0.8.31' httpclient5Version = '5.0' hamcrestVersion = '2.2' httpclientVersion = '4.5.12' httpcoreVersion = '4.4.13' ioVersion = '2.6' jacksonVersion = '2.12.1' javafxVersion = '21.0.2' javaxAnnotationVersion = '1.2' jcsvVersion = '1.4.0' jetbrainsAnnotationsVersion = '13.0' jfoenixVersion = '9.0.10' joptVersion = '5.0.4' jsonsimpleVersion = '1.1.1' jsonrpc4jVersion = '1.6.0.bisq.1' jupiterVersion = '5.9.2' kotlinVersion = '1.3.41' langVersion = '3.11' logbackVersion = '1.1.11' loggingVersion = '1.2' lombokVersion = '1.18.30' mockitoVersion = '5.10.0' netlayerVersion = 'e2ce2a142c' // Tor browser version 13.0.15 and tor binary version: 0.4.8.11 protobufVersion = '3.19.1' protocVersion = protobufVersion pushyVersion = '0.13.2' qrgenVersion = '1.3' slf4jVersion = '1.7.30' sparkVersion = '2.5.2' os = osdetector.os == 'osx' ? 'mac' : osdetector.os == 'windows' ? 'win' : osdetector.os } repositories { mavenCentral() //mavenLocal() maven { url 'https://jitpack.io' } maven { url 'https://mvnrepository.com' } } tasks.withType(JavaCompile) { options.encoding = 'UTF-8' } checkstyle { toolVersion = '10.8.1' // https://raw.githubusercontent.com/checkstyle/checkstyle/checkstyle-10.8.1/src/main/resources/google_checks.xml configFile = rootProject.file("$rootDir/config/checkstyle/checkstyle.xml") } tasks.withType(Checkstyle) { minHeapSize.set('200m') maxHeapSize.set('1g') } jacoco { toolVersion = "0.8.10" reportsDirectory = file("$rootDir/build/reports/jacoco") } test.finalizedBy { testCodeCoverageReport { // tests are required to run before generating the report reports { xml.required.set(true) html.required.set(false) } } } test { useJUnitPlatform() } } configure([project(':cli'), project(':daemon'), project(':desktop'), project(':monitor'), project(':relay'), project(':seednode'), project(':statsnode'), project(':inventory'), project(':apitest')]) { apply plugin: 'application' build.dependsOn installDist installDist.destinationDir = file('build/app') distZip.enabled = false // the 'installDist' and 'startScripts' blocks below configure haveno executables to put // generated shell scripts in the root project directory, such that users can easily // discover and invoke e.g. ./haveno-desktop, ./haveno-seednode, etc. // See https://stackoverflow.com/q/46327736 for details. installDist { doLast { // copy generated shell scripts, e.g. `haveno-desktop` directly to the project // root directory for discoverability and ease of use copy { from "$destinationDir/bin" into rootProject.projectDir } // copy libs required for generated shell script classpaths to 'lib' dir under // the project root directory copy { from "$destinationDir/lib" into "${rootProject.projectDir}/lib" } // edit generated shell scripts such that they expect to be executed in the // project root dir as opposed to a 'bin' subdirectory if (osdetector.os == 'windows') { def windowsScriptFile = file("${rootProject.projectDir}/haveno-${applicationName}.bat") windowsScriptFile.text = windowsScriptFile.text.replace( 'set APP_HOME=%DIRNAME%..', 'set APP_HOME=%DIRNAME%') if (applicationName == 'desktop') { windowsScriptFile.text = windowsScriptFile.text.replace( 'DEFAULT_JVM_OPTS=', 'DEFAULT_JVM_OPTS=-XX:MaxRAM=4g ' + '--add-opens=javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED ' + '--add-opens=javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED ' + '--add-opens=java.base/java.lang.reflect=ALL-UNNAMED ' + '--add-opens=javafx.graphics/com.sun.javafx.scene=ALL-UNNAMED') } } else { def unixScriptFile = file("${rootProject.projectDir}/haveno-$applicationName") unixScriptFile.text = unixScriptFile.text.replace( 'APP_HOME=$( cd "${APP_HOME:-./}.." > /dev/null && pwd -P ) || exit', 'APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit') if (applicationName == 'desktop') { unixScriptFile.text = unixScriptFile.text.replace( 'DEFAULT_JVM_OPTS=""', 'DEFAULT_JVM_OPTS="-XX:MaxRAM=4g ' + '--add-opens=javafx.controls/com.sun.javafx.scene.control.behavior=ALL-UNNAMED ' + '--add-opens=javafx.controls/com.sun.javafx.scene.control=ALL-UNNAMED ' + '--add-opens=java.base/java.lang.reflect=ALL-UNNAMED ' + '--add-opens=javafx.graphics/com.sun.javafx.scene=ALL-UNNAMED"') } } if (applicationName == 'apitest') { // Pass the logback config file as a system property to avoid chatty // logback startup due to multiple logback.xml files in the classpath // (:daemon & :cli). def script = file("${rootProject.projectDir}/haveno-$applicationName") script.text = script.text.replace( 'DEFAULT_JVM_OPTS=""', 'DEFAULT_JVM_OPTS="' + '-Dlogback.configurationFile=apitest/build/resources/main/logback.xml"') } if (osdetector.os != 'windows') delete fileTree(dir: rootProject.projectDir, include: 'haveno-*.bat') else delete fileTree(dir: rootProject.projectDir, include: 'haveno-*', exclude: '*.bat') } } startScripts { // rename scripts from, e.g. `desktop` to `haveno-desktop` applicationName = "haveno-$applicationName" } } configure(project(':proto')) { apply plugin: 'com.google.protobuf' dependencies { annotationProcessor "org.projectlombok:lombok:$lombokVersion" compileOnly "javax.annotation:javax.annotation-api:$javaxAnnotationVersion" compileOnly "org.projectlombok:lombok:$lombokVersion" implementation "ch.qos.logback:logback-classic:$logbackVersion" implementation "ch.qos.logback:logback-core:$logbackVersion" implementation "com.google.guava:guava:$guavaVersion" implementation "com.google.protobuf:protobuf-java:$protobufVersion" implementation "org.slf4j:slf4j-api:$slf4jVersion" implementation("io.grpc:grpc-protobuf:$grpcVersion") { exclude(module: 'animal-sniffer-annotations') exclude(module: 'guava') } implementation("io.grpc:grpc-stub:$grpcVersion") { exclude(module: 'animal-sniffer-annotations') exclude(module: 'guava') } } sourceSets.main.java.srcDirs += [ 'build/generated/source/proto/main/grpc', 'build/generated/source/proto/main/java' ] protobuf { protoc { artifact = "com.google.protobuf:protoc:${protocVersion}" } plugins { grpc { artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}" } } generateProtoTasks { all()*.plugins { grpc {} } } } } configure(project(':assets')) { dependencies { implementation("com.github.bisq-network:bitcoinj:$bitcoinjVersion") { exclude(module: 'bcprov-jdk15on') exclude(module: 'guava') exclude(module: 'jsr305') exclude(module: 'okhttp') exclude(module: 'okio') exclude(module: 'protobuf-java') exclude(module: 'slf4j-api') } implementation "com.google.guava:guava:$guavaVersion" implementation "org.apache.commons:commons-lang3:$langVersion" implementation "org.slf4j:slf4j-api:$slf4jVersion" testImplementation "org.hamcrest:hamcrest:$hamcrestVersion" testImplementation "org.junit.jupiter:junit-jupiter-api:$jupiterVersion" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jupiterVersion" } } configure(project(':common')) { dependencies { implementation project(':proto') annotationProcessor "org.projectlombok:lombok:$lombokVersion" compileOnly "javax.annotation:javax.annotation-api:$javaxAnnotationVersion" compileOnly "org.projectlombok:lombok:$lombokVersion" implementation "ch.qos.logback:logback-classic:$logbackVersion" implementation "ch.qos.logback:logback-core:$logbackVersion" implementation("com.github.bisq-network:bitcoinj:$bitcoinjVersion") { exclude(module: 'jsr305') exclude(module: 'slf4j-api') exclude(module: 'guava') exclude(module: 'protobuf-java') exclude(module: 'bcprov-jdk15on') exclude(module: 'okhttp') exclude(module: 'okio') } implementation "com.google.code.findbugs:jsr305:$findbugsVersion" implementation "com.google.code.gson:gson:$gsonVersion" implementation "com.google.guava:guava:$guavaVersion" implementation("com.google.inject:guice:$guiceVersion") { exclude(module: 'guava') } implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion" implementation "com.google.protobuf:protobuf-java:$protobufVersion" implementation "commons-io:commons-io:$ioVersion" implementation "net.sf.jopt-simple:jopt-simple:$joptVersion" implementation "org.apache.commons:commons-lang3:$langVersion" implementation "org.bouncycastle:bcpg-jdk15on:$bcVersion" implementation "org.jetbrains:annotations:$jetbrainsAnnotationsVersion" implementation "org.slf4j:slf4j-api:$slf4jVersion" testImplementation "org.hamcrest:hamcrest:$hamcrestVersion" testImplementation "org.junit.jupiter:junit-jupiter-api:$jupiterVersion" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jupiterVersion" runtimeOnly("io.grpc:grpc-netty-shaded:$grpcVersion") { exclude(module: 'guava') exclude(module: 'animal-sniffer-annotations') } // override transitive dependency and use latest version from bisq implementation(group: 'com.github.bisq-network', name: 'jtorctl') { version { strictly "[b2a172f44edcd8deaa5ed75d936dcbb007f0d774]" } } implementation "org.openjfx:javafx-base:$javafxVersion:$os" implementation "org.openjfx:javafx-graphics:$javafxVersion:$os" } } configure(project(':p2p')) { dependencies { implementation project(':proto') implementation project(':common') annotationProcessor "org.projectlombok:lombok:$lombokVersion" compileOnly "org.projectlombok:lombok:$lombokVersion" implementation "com.google.guava:guava:$guavaVersion" implementation "com.google.protobuf:protobuf-java:$protobufVersion" implementation "org.fxmisc.easybind:easybind:$easybindVersion" implementation "org.slf4j:slf4j-api:$slf4jVersion" implementation("com.github.haveno-dex.netlayer:tor.external:$netlayerVersion") { exclude(module: 'slf4j-api') } implementation("com.github.haveno-dex.netlayer:tor.native:$netlayerVersion") { exclude(module: 'slf4j-api') } implementation("com.github.bisq-network:bitcoinj:$bitcoinjVersion") { exclude(module: 'bcprov-jdk15on') exclude(module: 'guava') exclude(module: 'jsr305') exclude(module: 'okhttp') exclude(module: 'okio') exclude(module: 'protobuf-java') exclude(module: 'slf4j-api') } implementation("com.google.inject:guice:$guiceVersion") { exclude(module: 'guava') } implementation("org.apache.httpcomponents:httpclient:$httpclientVersion") { exclude(module: 'commons-codec') } testAnnotationProcessor "org.projectlombok:lombok:$lombokVersion" testCompileOnly "org.projectlombok:lombok:$lombokVersion" testImplementation "org.junit.jupiter:junit-jupiter-api:$jupiterVersion" testImplementation "org.junit.jupiter:junit-jupiter-params:$jupiterVersion" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jupiterVersion" testImplementation "ch.qos.logback:logback-classic:$logbackVersion" testImplementation "ch.qos.logback:logback-core:$logbackVersion" testImplementation "org.apache.commons:commons-lang3:$langVersion" testImplementation("org.mockito:mockito-core:$mockitoVersion") testImplementation("org.mockito:mockito-junit-jupiter:$mockitoVersion") implementation "org.openjfx:javafx-base:$javafxVersion:$os" implementation "org.openjfx:javafx-graphics:$javafxVersion:$os" } } configure(project(':core')) { dependencies { implementation project(':proto') implementation project(':assets') implementation project(':common') implementation project(':p2p') annotationProcessor "org.projectlombok:lombok:$lombokVersion" compileOnly "javax.annotation:javax.annotation-api:$javaxAnnotationVersion" compileOnly "org.projectlombok:lombok:$lombokVersion" implementation "ch.qos.logback:logback-classic:$logbackVersion" implementation "ch.qos.logback:logback-core:$logbackVersion" implementation "com.fasterxml.jackson.core:jackson-core:$jacksonVersion" implementation "com.fasterxml.jackson.core:jackson-annotations:$jacksonVersion" implementation "com.google.code.findbugs:jsr305:$findbugsVersion" implementation "com.google.code.gson:gson:$gsonVersion" implementation "com.google.guava:guava:$guavaVersion" implementation "com.google.protobuf:protobuf-java:$protobufVersion" implementation "commons-codec:commons-codec:$codecVersion" implementation "commons-io:commons-io:$ioVersion" implementation "net.sf.jopt-simple:jopt-simple:$joptVersion" implementation "org.apache.commons:commons-lang3:$langVersion" implementation "org.apache.httpcomponents:httpcore:$httpcoreVersion" implementation "org.fxmisc.easybind:easybind:$easybindVersion" implementation "org.jetbrains:annotations:$jetbrainsAnnotationsVersion" implementation "org.slf4j:slf4j-api:$slf4jVersion" implementation("com.fasterxml.jackson.core:jackson-databind:$jacksonVersion") { exclude(module: 'jackson-annotations') } implementation("com.github.haveno-dex.netlayer:tor.native:$netlayerVersion") { exclude(module: 'slf4j-api') } implementation("com.github.haveno-dex.netlayer:tor.external:$netlayerVersion") { exclude(module: 'slf4j-api') } implementation("com.github.bisq-network:bitcoinj:$bitcoinjVersion") { exclude(module: 'bcprov-jdk15on') exclude(module: 'guava') exclude(module: 'jsr305') exclude(module: 'okhttp') exclude(module: 'okio') exclude(module: 'protobuf-java') exclude(module: 'slf4j-api') } implementation("com.github.bisq-network:jsonrpc4j:$jsonrpc4jVersion") { exclude(module: 'base64') exclude(module: 'httpcore-nio') } implementation("com.google.inject:guice:$guiceVersion") { exclude(module: 'guava') } implementation("org.apache.httpcomponents:httpclient:$httpclientVersion") { exclude(module: 'commons-codec') } testAnnotationProcessor "org.projectlombok:lombok:$lombokVersion" testCompileOnly "org.projectlombok:lombok:$lombokVersion" testImplementation "com.natpryce:make-it-easy:$easyVersion" testImplementation "org.hamcrest:hamcrest:$hamcrestVersion" testImplementation "org.junit.jupiter:junit-jupiter-api:$jupiterVersion" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jupiterVersion" testImplementation "org.mockito:mockito-core:$mockitoVersion" implementation "org.openjfx:javafx-base:$javafxVersion:$os" implementation "org.openjfx:javafx-graphics:$javafxVersion:$os" implementation("io.github.woodser:monero-java:$moneroJavaVersion") { exclude(module: 'jackson-core') exclude(module: 'jackson-annotations') exclude(module: 'jackson-databind') exclude(module: 'bcprov-jdk15on') exclude(group: 'org.slf4j', module: 'slf4j-simple') } } test { systemProperty 'jdk.attach.allowAttachSelf', true } task generateKeypairs(type: JavaExec) { mainClass = 'haveno.core.util.GenerateKeyPairs' classpath = sourceSets.main.runtimeClasspath } task havenoDeps { doLast { // get monero binaries download url Map moneroBinaries = [ 'linux-x86_64' : 'https://github.com/haveno-dex/monero/releases/download/release3/monero-bins-haveno-linux-x86_64.tar.gz', 'linux-x86_64-sha256' : '591e63c1e3249e0cfbba74f0302022160f64f049d06abff95417ad3ecb588581', 'linux-aarch64' : 'https://github.com/haveno-dex/monero/releases/download/release3/monero-bins-haveno-linux-aarch64.tar.gz', 'linux-aarch64-sha256' : 'fb0a91d07dbbc30646af8007205dbd11c59fb1d124a3b2d703511d8ee2739acc', 'mac' : 'https://github.com/haveno-dex/monero/releases/download/release3/monero-bins-haveno-mac.tar.gz', 'mac-sha256' : '9eb01951976767372a3d10180c092af937afe6494928ea73e311476be5c0eba3', 'windows' : 'https://github.com/haveno-dex/monero/releases/download/release3/monero-bins-haveno-windows.zip', 'windows-sha256' : '49b84fab3a1f69564068fecff105b6079b843d99792409dffca4a66eb279288f' ] String osKey if (Os.isFamily(Os.FAMILY_WINDOWS)) { osKey = 'windows' } else if (Os.isFamily(Os.FAMILY_MAC)) { osKey = 'mac' } else { String architecture = System.getProperty("os.arch").toLowerCase() if (architecture.contains('aarch64') || architecture.contains('arm')) { osKey = 'linux-aarch64' } else { osKey = 'linux-x86_64' } } String moneroDownloadUrl = moneroBinaries[osKey] String moneroSHA256Hash = moneroBinaries[osKey + '-sha256'] String moneroArchiveFileName = moneroDownloadUrl.tokenize('/').last() String localnetDirName = '.localnet' File localnetDir = new File(project.rootDir, localnetDirName) localnetDir.mkdirs() File moneroArchiveFile = new File(localnetDir, moneroArchiveFileName) ext.downloadAndVerifyDependencies(moneroDownloadUrl, moneroSHA256Hash, moneroArchiveFile) // extract if dependencies are missing or if archive was updated File monerodFile File moneroRpcFile if (Os.isFamily(Os.FAMILY_WINDOWS)) { monerodFile = new File(localnetDir, 'monerod.exe') moneroRpcFile = new File(localnetDir, 'monero-wallet-rpc.exe') } else { monerodFile = new File(localnetDir, 'monerod') moneroRpcFile = new File(localnetDir, 'monero-wallet-rpc') } if (ext.dependencyDownloadedAndVerified || !monerodFile.exists() || !moneroRpcFile.exists()) { if (Os.isFamily(Os.FAMILY_WINDOWS)) { ext.extractArchiveZip(moneroArchiveFile, localnetDir) } else { ext.extractArchiveTarGz(moneroArchiveFile, localnetDir) } // add the current platform's monero dependencies into the resources folder for installation copy { from "${monerodFile}" into "${project(':core').projectDir}/src/main/resources/bin" } copy { from "${moneroRpcFile}" into "${project(':core').projectDir}/src/main/resources/bin" } } } ext.extractArchiveTarGz = { File tarGzFile, File destinationDir -> println "Extracting tar.gz ${tarGzFile}" // Gradle's tar extraction preserves permissions (crucial for jpackage to function correctly) copy { from tarTree(resources.gzip(tarGzFile)) into destinationDir } println "Extracted to ${destinationDir}" } ext.extractArchiveZip = { File zipFile, File destinationDir -> println "Extracting zip ${zipFile}..." ant.unzip(src: zipFile, dest: destinationDir) println "Extracted to ${destinationDir}" } ext.downloadAndVerifyDependencies = { String archiveURL, String archiveSHA256, File destinationArchiveFile -> ext.dependencyDownloadedAndVerified = false // if archive exists, check to see if its already up to date if (destinationArchiveFile.exists()) { println "Verifying existing archive ${destinationArchiveFile}" ant.archiveHash = archiveSHA256 ant.checksum(file: destinationArchiveFile, algorithm: 'SHA-256', property: '${archiveHash}', verifyProperty: 'existingHashMatches') if (ant.properties['existingHashMatches'] != 'true') { println "Existing archive does not match hash ${archiveSHA256}" } else { println "Existing archive matches hash" return } } // download archives println "Downloading ${archiveURL}" ant.get(src: archiveURL, dest: destinationArchiveFile) println 'Download saved to ' + destinationArchiveFile // verify checksum println 'Verifying checksum for downloaded binary ...' ant.archiveHash = archiveSHA256 ant.checksum(file: destinationArchiveFile, algorithm: 'SHA-256', property: '${archiveHash}', verifyProperty: 'downloadedHashMatches') // use a different verifyProperty name from existing verification or it will always fail if (ant.properties['downloadedHashMatches'] != 'true') { ant.fail('Checksum mismatch: Downloaded archive has a different checksum than expected') } println 'Checksum verified' ext.dependencyDownloadedAndVerified = true } } processResources.dependsOn havenoDeps // before both test and build } configure(project(':cli')) { mainClassName = 'haveno.cli.CliMain' dependencies { implementation project(':proto') annotationProcessor "org.projectlombok:lombok:$lombokVersion" compileOnly "org.projectlombok:lombok:$lombokVersion" implementation "ch.qos.logback:logback-classic:$logbackVersion" implementation "ch.qos.logback:logback-core:$logbackVersion" implementation "com.google.guava:guava:$guavaVersion" implementation "com.google.protobuf:protobuf-java:$protobufVersion" implementation "net.sf.jopt-simple:jopt-simple:$joptVersion" implementation "org.slf4j:slf4j-api:$slf4jVersion" implementation("io.grpc:grpc-core:$grpcVersion") { exclude(module: 'animal-sniffer-annotations') exclude(module: 'guava') } implementation("io.grpc:grpc-stub:$grpcVersion") { exclude(module: 'animal-sniffer-annotations') exclude(module: 'guava') } runtimeOnly("io.grpc:grpc-netty-shaded:$grpcVersion") { exclude(module: 'animal-sniffer-annotations') exclude(module: 'guava') } testAnnotationProcessor "org.projectlombok:lombok:$lombokVersion" testCompileOnly "org.projectlombok:lombok:$lombokVersion" testImplementation "org.bitbucket.cowwoc:diff-match-patch:$cowwocVersion" testImplementation "org.junit.jupiter:junit-jupiter-api:$jupiterVersion" testImplementation "org.junit.jupiter:junit-jupiter-params:$jupiterVersion" testRuntimeOnly "javax.annotation:javax.annotation-api:$javaxAnnotationVersion" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jupiterVersion" } } configure(project(':desktop')) { apply plugin: 'com.github.johnrengelman.shadow' apply from: 'package/package.gradle' version = '1.0.11-SNAPSHOT' jar.manifest.attributes( "Implementation-Title": project.name, "Implementation-Version": version, "CFBundleVersion": version) mainClassName = 'haveno.desktop.app.HavenoAppMain' tasks.withType(AbstractArchiveTask) { preserveFileTimestamps = false reproducibleFileOrder = true } sourceSets.main.resources.srcDirs += ['src/main/java'] // to copy fxml and css files dependencies { implementation project(':assets') implementation project(':common') implementation project(':proto') implementation project(':p2p') implementation project(':core') annotationProcessor "org.projectlombok:lombok:$lombokVersion" compileOnly "org.projectlombok:lombok:$lombokVersion" implementation "ch.qos.logback:logback-classic:$logbackVersion" implementation "ch.qos.logback:logback-core:$logbackVersion" implementation "com.google.code.gson:gson:$gsonVersion" implementation "com.google.guava:guava:$guavaVersion" implementation "com.google.protobuf:protobuf-java:$protobufVersion" implementation "com.googlecode.jcsv:jcsv:$jcsvVersion" implementation "com.jfoenix:jfoenix:$jfoenixVersion" implementation "commons-io:commons-io:$ioVersion" implementation "de.jensd:fontawesomefx-commons:$fontawesomefxCommonsVersion" implementation "de.jensd:fontawesomefx-materialdesignfont:$fontawesomefxMaterialdesignfontVersion" implementation "de.jensd:fontawesomefx:$fontawesomefxVersion" implementation "net.glxn:qrgen:$qrgenVersion" implementation "org.apache.commons:commons-lang3:$langVersion" implementation "org.bouncycastle:bcpg-jdk15on:$bcVersion" implementation "org.fxmisc.easybind:easybind:$easybindVersion" implementation "org.jetbrains:annotations:$jetbrainsAnnotationsVersion" implementation "org.slf4j:slf4j-api:$slf4jVersion" implementation("com.github.bisq-network:bitcoinj:$bitcoinjVersion") { exclude(module: 'bcprov-jdk15on') exclude(module: 'guava') exclude(module: 'jsr305') exclude(module: 'okhttp') exclude(module: 'okio') exclude(module: 'protobuf-java') exclude(module: 'slf4j-api') } implementation("com.google.inject:guice:$guiceVersion") { exclude(module: 'guava') } testAnnotationProcessor "org.projectlombok:lombok:$lombokVersion" testCompileOnly "org.projectlombok:lombok:$lombokVersion" testImplementation "com.natpryce:make-it-easy:$easyVersion" testImplementation "org.mockito:mockito-core:$mockitoVersion" testImplementation "org.hamcrest:hamcrest:$hamcrestVersion" testImplementation "org.junit.jupiter:junit-jupiter-api:$jupiterVersion" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jupiterVersion" implementation("io.github.woodser:monero-java:$moneroJavaVersion") { exclude(module: 'jackson-core') exclude(module: 'jackson-annotations') exclude(module: 'jackson-databind') exclude(module: 'bcprov-jdk15on') exclude(group: 'org.slf4j', module: 'slf4j-simple') } implementation "org.openjfx:javafx-controls:$javafxVersion:$os" implementation "org.openjfx:javafx-fxml:$javafxVersion:$os" implementation "org.openjfx:javafx-swing:$javafxVersion:$os" implementation "org.openjfx:javafx-base:$javafxVersion:$os" implementation "org.openjfx:javafx-graphics:$javafxVersion:$os" } test { systemProperty 'jdk.attach.allowAttachSelf', true } } configure(project(':monitor')) { mainClassName = 'haveno.monitor.Monitor' dependencies { implementation project(':assets') implementation project(':common') implementation project(':core') implementation project(':p2p') annotationProcessor "org.projectlombok:lombok:$lombokVersion" compileOnly "org.projectlombok:lombok:$lombokVersion" implementation "ch.qos.logback:logback-classic:$logbackVersion" implementation "ch.qos.logback:logback-core:$logbackVersion" implementation "com.google.guava:guava:$guavaVersion" implementation "org.slf4j:slf4j-api:$slf4jVersion" implementation("com.github.haveno-dex.netlayer:tor.external:$netlayerVersion") { exclude(module: 'slf4j-api') } implementation("com.github.haveno-dex.netlayer:tor.native:$netlayerVersion") { exclude(module: 'slf4j-api') } implementation("com.google.inject:guice:$guiceVersion") { exclude(module: 'guava') } testAnnotationProcessor "org.projectlombok:lombok:$lombokVersion" testCompileOnly "org.projectlombok:lombok:$lombokVersion" testImplementation "org.junit.jupiter:junit-jupiter-api:$jupiterVersion" testImplementation "org.junit.jupiter:junit-jupiter-params:$jupiterVersion" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jupiterVersion" implementation "org.openjfx:javafx-base:$javafxVersion:$os" implementation "org.openjfx:javafx-graphics:$javafxVersion:$os" } } configure(project(':relay')) { mainClassName = 'haveno.relay.RelayMain' dependencies { implementation project(':common') implementation "ch.qos.logback:logback-classic:$logbackVersion" implementation "ch.qos.logback:logback-core:$logbackVersion" implementation("com.google.firebase:firebase-admin:$firebaseVersion") { exclude(module: 'commons-logging') exclude(module: 'grpc-auth') exclude(module: 'httpclient') exclude(module: 'httpcore') } implementation "com.sparkjava:spark-core:$sparkVersion" implementation "com.turo:pushy:$pushyVersion" implementation "commons-codec:commons-codec:$codecVersion" implementation "io.grpc:grpc-auth:$grpcVersion" } } configure(project(':seednode')) { apply plugin: 'com.github.johnrengelman.shadow' mainClassName = 'haveno.seednode.SeedNodeMain' dependencies { implementation project(':common') implementation project(':p2p') implementation project(':core') annotationProcessor "org.projectlombok:lombok:$lombokVersion" compileOnly "org.projectlombok:lombok:$lombokVersion" implementation "com.google.guava:guava:$guavaVersion" implementation "org.slf4j:slf4j-api:$slf4jVersion" implementation("com.google.inject:guice:$guiceVersion") { exclude(module: 'guava') } testImplementation "org.mockito:mockito-core:$mockitoVersion" testImplementation "org.junit.jupiter:junit-jupiter-api:$jupiterVersion" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jupiterVersion" } } configure(project(':statsnode')) { mainClassName = 'haveno.statistics.StatisticsMain' dependencies { implementation project(':common') implementation project(':p2p') implementation project(':core') annotationProcessor "org.projectlombok:lombok:$lombokVersion" compileOnly "org.projectlombok:lombok:$lombokVersion" implementation "org.slf4j:slf4j-api:$slf4jVersion" implementation("com.google.inject:guice:$guiceVersion") { exclude(module: 'guava') } } } configure(project(':daemon')) { mainClassName = 'haveno.daemon.app.HavenoDaemonMain' dependencies { implementation project(':proto') implementation project(':common') implementation project(':p2p') implementation project(':core') annotationProcessor "org.projectlombok:lombok:$lombokVersion" compileOnly "javax.annotation:javax.annotation-api:$javaxAnnotationVersion" compileOnly "org.projectlombok:lombok:$lombokVersion" implementation "ch.qos.logback:logback-classic:$logbackVersion" implementation "ch.qos.logback:logback-core:$logbackVersion" implementation "com.google.code.gson:gson:$gsonVersion" implementation "com.google.guava:guava:$guavaVersion" implementation "com.google.protobuf:protobuf-java:$protobufVersion" implementation "org.apache.commons:commons-lang3:$langVersion" implementation "org.jetbrains:annotations:$jetbrainsAnnotationsVersion" implementation "org.slf4j:slf4j-api:$slf4jVersion" implementation("com.github.bisq-network:bitcoinj:$bitcoinjVersion") { exclude(module: 'bcprov-jdk15on') exclude(module: 'guava') exclude(module: 'jsr305') exclude(module: 'okhttp') exclude(module: 'okio') exclude(module: 'protobuf-java') exclude(module: 'slf4j-api') } implementation("com.google.inject:guice:$guiceVersion") { exclude(module: 'guava') } implementation("io.grpc:grpc-protobuf:$grpcVersion") { exclude(module: 'animal-sniffer-annotations') exclude(module: 'guava') } implementation("io.grpc:grpc-stub:$grpcVersion") { exclude(module: 'animal-sniffer-annotations') exclude(module: 'guava') } runtimeOnly("io.grpc:grpc-netty-shaded:$grpcVersion") { exclude(module: 'animal-sniffer-annotations') exclude(module: 'guava') } testAnnotationProcessor "org.projectlombok:lombok:$lombokVersion" testCompileOnly "org.projectlombok:lombok:$lombokVersion" testImplementation "org.junit.jupiter:junit-jupiter-api:$jupiterVersion" testImplementation "org.junit.jupiter:junit-jupiter-params:$jupiterVersion" testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:$jupiterVersion") implementation("io.github.woodser:monero-java:$moneroJavaVersion") { exclude(module: 'jackson-core') exclude(module: 'jackson-annotations') exclude(module: 'jackson-databind') exclude(module: 'bcprov-jdk15on') exclude(group: 'org.slf4j', module: 'slf4j-simple') } implementation "org.openjfx:javafx-base:$javafxVersion:$os" implementation "org.openjfx:javafx-graphics:$javafxVersion:$os" } } configure(project(':inventory')) { apply plugin: 'com.github.johnrengelman.shadow' mainClassName = 'haveno.inventory.InventoryMonitorMain' dependencies { implementation project(':common') implementation project(':p2p') implementation project(':core') annotationProcessor "org.projectlombok:lombok:$lombokVersion" compileOnly "org.projectlombok:lombok:$lombokVersion" implementation "ch.qos.logback:logback-classic:$logbackVersion" implementation "ch.qos.logback:logback-core:$logbackVersion" implementation "com.google.guava:guava:$guavaVersion" implementation "com.sparkjava:spark-core:$sparkVersion" implementation "org.jetbrains:annotations:$jetbrainsAnnotationsVersion" implementation("com.google.inject:guice:$guiceVersion") { exclude(module: 'guava') } } } configure(project(':apitest')) { mainClassName = 'haveno.apitest.ApiTestMain' // We have to disable the :apitest 'test' task by default because we do not want // to interfere with normal builds. To run JUnit tests in this subproject: // Run a normal build and install dao-setup files first, then run: // 'gradle :apitest:test -DrunApiTests=true' test.enabled = System.getProperty("runApiTests") == "true" test { outputs.upToDateWhen { false } // Don't use previously cached test outputs. testLogging { showStackTraces = true // Show full stack traces in the console. exceptionFormat = "full" // Show passed & failed tests, and anything printed to stderr by the tests in the console. // Do not show skipped tests in the console; they are shown in the html report. events "passed", "failed", "standardError" } afterSuite { desc, result -> if (!desc.parent) { println("${result.resultType} " + "[${result.testCount} tests, " + "${result.successfulTestCount} passed, " + "${result.failedTestCount} failed, " + "${result.skippedTestCount} skipped] html report contains skipped test info") // Show report link if all tests passed in case you want to see more detail, stdout, skipped, etc. if (result.resultType == TestResult.ResultType.SUCCESS) { DirectoryReport htmlReport = getReports().getHtml() String reportUrl = new ConsoleRenderer() .asClickableFileUrl(htmlReport.getEntryPoint()) println("REPORT " + reportUrl) } } } } dependencies { implementation project(':proto') implementation project(':common') implementation project(':core') implementation project(':seednode') implementation project(':desktop') implementation project(':daemon') implementation project(':cli') annotationProcessor "org.projectlombok:lombok:$lombokVersion" compileOnly "javax.annotation:javax.annotation-api:$javaxAnnotationVersion" compileOnly "org.projectlombok:lombok:$lombokVersion" implementation "ch.qos.logback:logback-classic:$logbackVersion" implementation "ch.qos.logback:logback-core:$logbackVersion" implementation "com.google.code.gson:gson:$gsonVersion" implementation "com.google.guava:guava:$guavaVersion" implementation "com.google.protobuf:protobuf-java:$protobufVersion" implementation "net.sf.jopt-simple:jopt-simple:$joptVersion" implementation "org.apache.commons:commons-lang3:$langVersion" implementation "org.slf4j:slf4j-api:$slf4jVersion" implementation("com.github.bisq-network:bitcoinj:$bitcoinjVersion") { exclude(module: 'bcprov-jdk15on') exclude(module: 'guava') exclude(module: 'jsr305') exclude(module: 'okhttp') exclude(module: 'okio') exclude(module: 'protobuf-java') exclude(module: 'slf4j-api') } implementation("io.grpc:grpc-protobuf:$grpcVersion") { exclude(module: 'animal-sniffer-annotations') exclude(module: 'guava') } implementation("io.grpc:grpc-stub:$grpcVersion") { exclude(module: 'animal-sniffer-annotations') exclude(module: 'guava') } testAnnotationProcessor "org.projectlombok:lombok:$lombokVersion" testCompileOnly "org.projectlombok:lombok:$lombokVersion" testImplementation "org.junit.jupiter:junit-jupiter-api:$jupiterVersion" testImplementation "org.junit.jupiter:junit-jupiter-params:$jupiterVersion" testRuntimeOnly "javax.annotation:javax.annotation-api:$javaxAnnotationVersion" testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$jupiterVersion" } }