Может ли это быть быстрее для построения местного изображения Java с Maven, чем Gradle?JAVA

Программисты JAVA общаются здесь
Anonymous
Может ли это быть быстрее для построения местного изображения Java с Maven, чем Gradle?

Сообщение Anonymous »

Это звучит безумно для меня, и я действительно не хотел спрашивать об этом на Stackoverflow, так как я представляю, насколько я глуп. Тем не менее, мне интересно, если вы так думаете или имели аналогичный опыт.project
pom.xml
└───common
│ pom.xml
└───service-a
│ pom.xml
└───service-b
│ pom.xml
... (8 services in total)
< /code>
Оригинальная команда для создания собственного изображения с Maven < /p>
mvn --projects common,service-a --batch-mode -U -Pnative --also-make package -DskipTests
< /code>
В моем справедливом концептуальном предрассудке Gradle Building было бы быстрее, чем с Maven, поэтому я пытался это сделать. < /p>
project
build.gradle
└───common
│ build.gradle
└───service-a
│ build.gradle
└───service-b
│ build.gradle
... (8 services in total)
< /code>
./gradlew :service-a:nativeCompile --no-daemon -x test
< /code>
However, I really can't believe that, building with Maven is MUCH FASTER than the one with Gradle.
I'd like to know why it is, but have no clues at all.
I attached my piece of build management of Gradle in case if some of you notice that I did a huge mistake.
Root project build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.12' apply false
id 'io.spring.dependency-management' version '1.1.6' apply false
id 'org.graalvm.buildtools.native' version '0.10.2' apply false
}

allprojects {
group = 'com.myservice'
version = '1-SNAPSHOT'

repositories {
mavenCentral()
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/MyProject")
credentials {
username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
password = project.findProperty("gpr.key") ?: System.getenv("TOKEN")
}
}
}
}

ext {
springBootVersion = '3.3.12'
awsSdkVersion = '2.31.59'
lombokVersion = '1.18.38'
mapstructVersion = '1.6.3'
shedlockVersion = '6.9.0'
caffeineVersion = '3.2.1'
uuidCreatorVersion = '6.1.1'
logbackMoreAppendersVersion = '1.8.8'
testcontainersRedisVersion = '2.2.4'
testcontainersLocalstackVersion = '1.21.1'
}

project(':common') {
apply plugin: 'java-library'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'maven-publish'

java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}

configurations {
compileOnly {
extendsFrom annotationProcessor
}
}

dependencyManagement {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:${springBootVersion}"
mavenBom "software.amazon.awssdk:bom:${awsSdkVersion}"
}
}

dependencies {
api 'org.springframework.boot:spring-boot-starter-web'
api 'org.springframework.boot:spring-boot-starter-data-jpa'
api 'org.springframework.boot:spring-boot-starter-data-redis'
api 'org.springframework.boot:spring-boot-starter-validation'

// ShedLock dependencies for distributed locking
api "net.javacrumbs.shedlock:shedlock-spring:${shedlockVersion}"
api "net.javacrumbs.shedlock:shedlock-provider-redis-spring:${shedlockVersion}"

api 'com.fasterxml.jackson.dataformat:jackson-dataformat-yaml'
api 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'

api "org.mapstruct:mapstruct:${mapstructVersion}"
annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}"
annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0'

api 'org.apache.commons:commons-lang3'
api 'commons-net:commons-net:3.9.0'
api 'io.valkey:valkey-java:5.3.0'
api 'com.squareup.okhttp3:okhttp:4.12.0'
api 'com.google.guava:guava:33.4.0-jre'
api "com.github.ben-manes.caffeine:caffeine:${caffeineVersion}"
api "com.github.f4b6a3:uuid-creator:${uuidCreatorVersion}"

api 'software.amazon.awssdk:dynamodb-enhanced'
api 'software.amazon.awssdk:sts'
api 'software.amazon.awssdk:ec2'
api 'software.amazon.awssdk:imds'

api "com.sndyuk:logback-more-appenders:${logbackMoreAppendersVersion}"
api 'org.komamitsu:fluency-core:2.7.3'
api 'org.komamitsu:fluency-fluentd:2.7.3'
api 'org.komamitsu:fluency-fluentd-ext:2.7.3'

compileOnly 'com.github.spotbugs:spotbugs-annotations:4.8.6'
compileOnly 'com.google.code.findbugs:jsr305:3.0.2'

compileOnly "org.projectlombok:lombok:${lombokVersion}"
annotationProcessor "org.projectlombok:lombok:${lombokVersion}"
testCompileOnly "org.projectlombok:lombok:${lombokVersion}"
testAnnotationProcessor "org.projectlombok:lombok:${lombokVersion}"

testImplementation 'org.springframework.boot:spring-boot-starter-test'
testImplementation "com.redis:testcontainers-redis:${testcontainersRedisVersion}"
testImplementation "org.testcontainers:localstack:${testcontainersLocalstackVersion}"
}

compileJava {
options.compilerArgs += [
'-Amapstruct.defaultComponentModel=spring'
]
}

tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}

jar {
archiveClassifier = ''
enabled = true
}
}

// Configure service projects (all except common)
configure(subprojects.findAll { it.name != 'common' }) {
apply plugin: 'java'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'org.graalvm.buildtools.native'

java {
sourceCompatibility = JavaVersion.VERSION_21
targetCompatibility = JavaVersion.VERSION_21
}

configurations {
compileOnly {
extendsFrom annotationProcessor
}
// Exclude Tomcat in favor of Undertow for all services
implementation {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
}

dependencyManagement {
imports {
mavenBom "org.springframework.boot:spring-boot-dependencies:${springBootVersion}"
mavenBom "software.amazon.awssdk:bom:${awsSdkVersion}"
}
dependencies {
dependency "net.javacrumbs.shedlock:shedlock-spring:${shedlockVersion}"
dependency "net.javacrumbs.shedlock:shedlock-provider-redis-spring:${shedlockVersion}"
}
}

dependencies {
implementation project(':common')

implementation 'org.springframework.boot:spring-boot-starter'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-undertow'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-validation'
}

compileJava {
options.compilerArgs += [
'-Amapstruct.defaultComponentModel=spring'
]
}

tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}

springBoot {
buildInfo()
}

graalvmNative {
binaries {
main {
buildArgs.addAll([
'--no-fallback',
'-H:+ReportExceptionStackTraces',
'-H:+UnlockExperimentalVMOptions',
'--initialize-at-build-time=org.slf4j.LoggerFactory,org.slf4j.impl.StaticLoggerBinder',
'--enable-all-security-services',
'--gc=G1'
])
}
}
metadataRepository {
enabled = true
}
}
}

// Configure publishing for all projects
subprojects {
apply plugin: 'maven-publish'

publishing {
publications {
maven(MavenPublication) {
from components.java

pom {
name = project.name
description = 'testapp ' + project.name
url = 'https://github.com/MyProject'

scm {
connection = 'scm:git:git@github.com:MyProject/testapp.git'
developerConnection = 'scm:git:git@github.com:MyProject/testapp.git'
url = 'https://github.com/MyProject/testapp'
}
}
}
}

repositories {
maven {
name = "GitHubPackages"
url = uri("https://maven.pkg.github.com/MyProject/testapp")
credentials {
username = project.findProperty("gpr.user") ?: System.getenv("USERNAME")
password = project.findProperty("gpr.key") ?: System.getenv("TOKEN")
}
}
}
}
}
< /code>
service-a build.gradle
plugins {
id 'org.graalvm.buildtools.native'
}

group = 'com.MypPoject.testapp'

dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-redis'
}
< /code>
Note1: build.gradle for common is already in the project root. The building performance is just the same if I separate it into common or managing altogether in root.
Note2: I thought --parallel for Gradle build isn't option for my case as I use only basic plan, and it already uses all threads(2) without this option.
Build resources:
  • 5.86GB of memory (75.6% of 7.76GB system memory, determined at start)
  • 2 thread(s) (100.0% of 2 available processor(s), determined at start)
Erros in Github Actions
=== Image generator watchdog detected no activity. This can be a sign of a deadlock during image building. Dumping all stack traces. Current time: Sun Jul 06 20:01:12 UTC 2025
"main" Id=1 in WAITING on lock=java.util.concurrent.ForkJoinTask$AdaptedRunnableAction@78388ce3

...

* What went wrong:
Execution failed for task ':service-a:nativeCompile'.
> Process 'command '/opt/hostedtoolcache/graalvm-jdk-21_linux-x64_bin/21.0.0/x64/graalvm-jdk-21.0.7+8.1/bin/native-image'' finished with non-zero exit value 30

* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
> Get more help at https://help.gradle.org.
13 actionable tasks: 13 executed

BUILD FAILED in 21m 43s
< /code>
Can it be really possible that building with Maven faster than the one with Gradle?
Build time in Github Actions with basic plan runner
Maven: Approx 18 mins
Gradle: Can't be finished (Due to the out of memory for heap size)
I just want to know it clearly if...
  • I wrote Gradle build management wrong way.
  • It's just possible that Maven building can be faster than Gradle.
  • Something else...


Подробнее здесь: https://stackoverflow.com/questions/796 ... han-gradle

Вернуться в «JAVA»