Files
elink-online-common/build.gradle
T
curry772 dd7c8a29bf newNumberSafeMapper 출력측 옵션 추가 및 ArrayNode.set 버전 호환 수정
JacksonUtil.newNumberSafeMapper() 는 USE_BIG_DECIMAL_FOR_FLOATS +
withExactBigDecimals 로 입력(파싱)측만 막고 있었다. DecimalNode 직렬화는
BigDecimal.toString() 이라 scale 이 음수이거나 adjusted exponent < -6 일 때
지수 표기가 나온다. 즉 파싱을 제대로 해도 내보낼 때 작은 소수가 깨졌다.
  0.00000012 -> 1.2E-7 , -0.0000005 -> -5E-7
WRITE_BIGDECIMAL_AS_PLAIN 을 추가해 출력측까지 보존한다.
(금액처럼 scale >= 0 인 큰 값은 원래 영향 없음. 이율/환율이 대상)

또한 JacksonUtil.setValue() 가 ArrayNode.set(int, String) 을 쓰고 있었다.
이 오버로드는 jackson-databind 2.13 부터이고, 실제 런타임은 2.12.7 이다
(2.12.7 은 set(int, JsonNode) 하나뿐). jackson-dataformat-xml:2.13.1 이
compileOnly 로 컴파일 클래스패스에만 2.13.1 을 올려 컴파일만 통과하던
상태였고, 배열 경로에 setText() 하면 운영에서 NoSuchMethodError 가 났다.
TextNode.valueOf() 로 감싸 set(int, JsonNode) 에 바인딩한다.

그 외
- TemplateCodeConvertAdapterErrorMsgHandler: 응답 JSON 왕복 지점 전환
- HttpAdapterServiceSupport, HttpClient5AdapterServiceRestAddFilter: 직렬화 지점 전환
- JsonReader: parse() 호출마다 ObjectMapper 를 새로 만들던 것을 static 싱글턴으로
  바꾸고 중복 설정 코드를 JacksonUtil 에 위임
- MessageKeyExtractor: 선언만 하고 쓰지 않는 ObjectMapper 필드 제거
- build.gradle: 미사용 jackson-dataformat-xml 제거 (common 은 Ignite 경유로 jackson 확보)

검증: gradlew compileJava BUILD SUCCESSFUL, databind 2.12.7 런타임에서
숫자 왕복 4건 + setText 배열/객체/미존재 경로 5건 전부 통과.
2026-08-28 09:26:32 +09:00

243 lines
8.4 KiB
Groovy

plugins {
id 'java-library'
id 'maven-publish'
id 'eclipse-wtp'
id 'idea'
id 'com.diffplug.eclipse.apt' version '3.41.1'
}
group 'com.eactive'
version '4.5.1-SNAPSHOT'
def springVersion = "5.3.27"
def quartzVersion = "2.3.2"
def undertowVersion = "1.4.28.Final"
def queryDslVersion = "5.0.0"
def hibernateVersion = "5.6.15.Final"
def generatedJavaDir = "$buildDir/generated/java"
def nexusUrl = "https://nexus.eactive.synology.me:8090"
java {
toolchain {
languageVersion = JavaLanguageVersion.of(8)
}
}
compileJava {
options.encoding = 'UTF-8'
// generatedJavaDir 는 아래 generatedSourceOutputDirectory 로 APT 가 이미 컴파일함.
// srcDir 로도 등록하면 낡은 생성물이 입력소스가 돼 APT 재생성 시 duplicate class 발생 → 등록 금지.
options.generatedSourceOutputDirectory = project.file(generatedJavaDir)
aptOptions {
processorArgs = [ 'querydsl.generatedAnnotationClass' : 'com.querydsl.core.annotations.Generated' ]
}
}
jar {
exclude '**/persistence.xml'
}
tasks.withType(JavaCompile) {
options.encoding = 'UTF-8'
}
dependencies {
annotationProcessor "org.projectlombok:lombok:1.18.28", "org.projectlombok:lombok-mapstruct-binding:0.2.0", "org.mapstruct:mapstruct-processor:1.5.5.Final"
annotationProcessor "com.querydsl:querydsl-apt:${queryDslVersion}:jpa", "jakarta.persistence:jakarta.persistence-api:2.2.3", "jakarta.annotation:jakarta.annotation-api:1.3.5"
//implementation project(':elink-online-core')
//implementation project(':elink-online-transformer')
api project(':elink-online-transformer')
// damo-manager.jar 를 제외한 나머지 libs 는 기존대로 컴파일 시점에만 사용한다.
// (WAS lib 또는 다른 경로에서 런타임에 제공됨)
compileOnly fileTree(dir: 'libs', include: ['*.jar'], exclude: ['damo-manager.jar'])
// damo-manager.jar: 기존에는 tomcat/lib 에 직접 넣어 런타임에 제공했으나,
// 배포 WAR(eapim-online.war)의 WEB-INF/lib 에 포함시키기 위해 런타임 의존성으로 전환한다.
// implementation 이므로 이 모듈의 compile/test classpath 와, 이 모듈을 project 의존성으로
// 참조하는 eapim-online 루트의 runtimeClasspath(= war 패키징 대상)에 함께 포함된다.
implementation files('libs/damo-manager.jar')
api (group: 'org.apache.activemq', name: 'activemq-console', version: '5.14.5'){
exclude group: 'com.fasterxml.jackson.core'
}
api group: 'org.apache.activemq', name: 'activemq-spring', version: '5.14.5'
api 'backport-util-concurrent:backport-util-concurrent:3.0'
api 'com.github.vladimir-bukhtoyarov:bucket4j-jcache:6.0.2'
api 'io.github.resilience4j:resilience4j-core:1.7.1'
api 'io.github.resilience4j:resilience4j-circuitbreaker:1.7.1'
api 'io.github.resilience4j:resilience4j-micrometer:1.7.1'
api 'io.micrometer:micrometer-core:1.5.17'
api 'io.micrometer:micrometer-registry-prometheus:1.5.17'
implementation "com.google.code.gson:gson:2.3.1"
//api "com.eactive:mina-core-1.0.10-custom:1.0:custom@jar"
api ("org.apache.mina:mina-filter-ssl:1.0.10") {
exclude module: 'mina-core'
}
api group: 'commons-fileupload', name: 'commons-fileupload', version: '1.5'
api 'org.snmp4j:snmp4j:1.9.1f'
api group: 'com.lmax', name: 'disruptor', version: '3.4.4'
api group: 'commons-httpclient', name: 'commons-httpclient', version: '3.1'
// api group: 'log4j', name: 'log4j', version: '1.2.17'
api 'com.nimbusds:nimbus-jose-jwt:9.24.3'
api 'org.bouncycastle:bcprov-jdk15on:1.70'
api "io.undertow:undertow-servlet:${undertowVersion}"
api 'org.java-websocket:Java-WebSocket:1.3.9'
api 'javax.cache:cache-api:1.1.1'
api 'org.apache.ignite:ignite-slf4j:2.14.0'
api 'org.apache.ignite:ignite-kubernetes:2.14.0'
// ignite 2.17 - JDK 11 이상 필요
// api 'org.apache.ignite:ignite-slf4j:2.17.0'
// api 'org.apache.ignite:ignite-kubernetes:2.17.0'
//api 'com.eactive:xc3:1.0'
//api 'com.eactive:xc2:1.0'
//api 'com.eactive:INICrypto:v4.1.22'
//api 'com.eactive:INISAFECore:v2.2.28'
//api 'com.eactive:INISAFENet:v7.2.51_NS'
//api 'com.eactive:INISAFEPKI:v1.1.33'
//api 'com.eactive:Egloan_aes:1.0'
//api 'com.eactive:ExafeiE2E:1.0'
//api 'com.eactive:tcseed:1.0'
//api "com.eactive:backport-util-concurrent:1.0"
api "org.quartz-scheduler:quartz:${quartzVersion}"
api group: 'commons-cli', name: 'commons-cli', version: '1.1'
api "org.springframework:spring-web:${springVersion}"
api "org.springframework:spring-jms:${springVersion}"
api "org.springframework.security.oauth:spring-security-oauth2:2.3.8.RELEASE"
api 'org.yaml:snakeyaml:1.30'
implementation 'org.codehaus.groovy:groovy:3.0.18'
api 'org.slf4j:jul-to-slf4j:1.7.35'
api 'org.slf4j:jcl-over-slf4j:1.7.35'
api 'org.slf4j:log4j-over-slf4j:1.7.35'
api 'org.slf4j:slf4j-api:1.7.35'
//compileOnly "tmax:webt:7.0.2.0-r11661-forJEUS8.0"
//compileOnly "tmax:webtasync:2.0.3.1-r11801-forJEUS8.1"
//compileOnly "tmax:jeus:1.0"
api 'org.apache.httpcomponents.client5:httpclient5:5.1'
api 'org.apache.httpcomponents.core5:httpcore5:5.1'
compileOnly group: 'javax.servlet', name: 'javax.servlet-api', version: '3.1.0'
compileOnly group: 'javax.servlet.jsp', name: 'javax.servlet.jsp-api', version: '2.3.3'
compileOnly 'javax.resource:javax.resource-api:1.7'
compileOnly 'javax.jms:javax.jms-api:2.0.1'
// jackson-dataformat-xml 제거 (2026-08-27)
// XmlMapper/JacksonXml* 사용처가 전 소스에 0건이고, 선언 버전(2.13.1)이
// 실제 해석되는 jackson-core/databind(2.12.7)와 마이너 불일치라 승격 시 위험했다.
api "org.springframework.security:spring-security-jwt:1.1.1.RELEASE"
testRuntimeOnly 'com.h2database:h2:2.1.214'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
testImplementation 'org.springframework.boot:spring-boot-starter-test:2.6.15'
testImplementation 'junit:junit:4.4'
testImplementation files('libs/kjb-safedb.jar')
}
test {
useJUnitPlatform()
}
publishing {
repositories {
maven {
name = 'eactiveRepository'
def releasesRepoUrl = "${nexusUrl}/repository/maven-releases/"
def snapshotsRepoUrl = "${nexusUrl}/repository/maven-snapshots/"
url = version.endsWith('SNAPSHOT') ? snapshotsRepoUrl : releasesRepoUrl
credentials(PasswordCredentials)
}
}
publications {
mavenJava(MavenPublication) {
from components.java
pom {
description = "eLink common module"
licenses {
license {
name = "Commercial License"
url = "http://eactive.co.kr"
}
}
}
}
}
}
task sourcesJar(type: Jar, dependsOn: classes) {
archiveClassifier = 'sources'
from sourceSets.main.allSource
}
artifacts {
archives sourcesJar
}
configurations.all {
exclude group: 'org.apache.geronimo.specs', module: 'geronimo-jta_1.0.1B_spec'
// exclude group: 'javax.transaction', module: 'javax.transaction-api'
resolutionStrategy {
// 동적 버전 탐색을 10분 캐시
cacheDynamicVersionsFor 10, 'minutes'
// 변하는 모듈(Changing Module)을 캐시하지 않음
cacheChangingModulesFor 0, 'seconds'
}
}
task settingEclipseEncoding {
if (project.file('.settings').exists()) {
File f = file('.settings/org.eclipse.core.resources.prefs')
f.write('eclipse.preferences.version=1\n')
f.append('encoding/<project>=utf-8')
}
}
task initDirs() {
file(generatedJavaDir).mkdirs()
}
eclipse {
synchronizationTasks settingEclipseEncoding, initDirs
jdt {
apt {
// generated 된 패스 경로를 .setting/org.eclipse.jdt.apt.core.prefs 의 org.eclipse.jdt.apt.genSrcDir에 적용한다.
// project > properties > Java Compiler > Annoation Processing 화면에서 확인 가능하다.
genSrcDir = file(generatedJavaDir)
}
}
project {
natures = ['org.eclipse.buildship.core.gradleprojectnature',
'org.eclipse.jdt.core.javanature',
'org.eclipse.wst.common.project.facet.core.nature',
'org.eclipse.wst.common.modulecore.ModuleCoreNature',
'org.eclipse.jem.workbench.JavaEMFNature']
buildCommand 'org.eclipse.buildship.core.gradleprojectbuilder'
buildCommand 'org.eclipse.wst.validation.validationbuilder'
buildCommand 'org.eclipse.wst.common.project.facet.core.builder'
buildCommand 'org.eclipse.jdt.core.javabuilder'
}
}