Ошибка Stackru при использовании Apache Jmeter Core

Я новичок в Gradle. Я использую свой gradle со сценарием kotlin dsl. Когда я выполняю, используя

gradle bootRun

Тогда это выдает ошибку StackoverFlow для log4J

Исключение в потоке "main" java.lang.StackruError в java.lang.reflect.InvocationTargetException.(InvocationTargetException.java:72) в sun.reflect.GeneratedMethodAccessor1.invoke(Неизвестный источник) в sun.reflect.Dein Java:43) на java.lang.reflect.Method.invoke(Method.java:498) на org.apache.logging.log4j.util.StackLocator.getCallerClass(StackLocator.java:110) на org.apache.logging.log4j.util.StackLocator.getCallerClass(StackLocator.java:123) в org.apache.logging.log4j.util.StackLocatorUtil.getCallerClass(StackLocatorUtil.java:55)

Как только я прокомментирую реализацию ( "org.apache.jmeter:ApacheJMeter_core:5.0") из сценария сборки, она не выдаст ошибку, что мне делать? Пожалуйста помоги.

Build.Gradle.kts

import org.jetbrains.kotlin.gradle.tasks.KotlinCompile


plugins {
    java
    kotlin("jvm") version "1.3.11"
    "kotlin-spring"
    id("org.springframework.boot") version "2.1.1.RELEASE"
}

group = "org.kayd"
version = "1.0-DEV"

repositories {
    mavenCentral()
}

dependencies {
    implementation(kotlin("stdlib-jdk8"))
    implementation(kotlin("reflect"))
    implementation("org.apache.commons:commons-collections4:4.2")
    implementation("org.springframework.boot:spring-boot-starter:2.1.1.RELEASE")
    implementation( "org.apache.jmeter:ApacheJMeter_core:5.0")
//    implementation("org.apache.jmeter:ApacheJMeter_java:5.0")
//    implementation( "org.apache.jmeter:ApacheJMeter_http:5.0")
//    implementation( "org.antlr:antlr:3.1.3")
//    implementation( "org.json:json:20180813")
    testCompile("junit", "junit", "4.12")
}

configure<JavaPluginConvention> {
    sourceCompatibility = JavaVersion.VERSION_1_8
}
tasks.withType<KotlinCompile> {
    kotlinOptions.jvmTarget = "1.8"
}

Основной Fun файл

package org.kayd

import org.springframework.boot.Banner
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.context.properties.EnableConfigurationProperties
import org.springframework.boot.runApplication

@EnableConfigurationProperties
@SpringBootApplication
open class StartApplication

fun main(args: Array<String>) {
    runApplication<StartApplication>(*args) {
        setBannerMode(Banner.Mode.OFF)
        setLogStartupInfo(true)
    }
}

1 ответ

Если вы перечислите свои зависимости проекта, вы увидите, что

  • org.apache.jmeter:ApacheJMeter_core:5.0 имеет транзитивную зависимость от commons-collections:commons-collections:3.2.2
  • который в свою очередь сталкивается с вашим org.apache.commons:commons-collections4:4.2

Таким образом, вы страдаете от формы Jar Hell. Вы не можете надежно использовать 2 разные версии одного и того же JAR в одном приложении, так как порядок загрузки классов в CLASSPATH - это большой вопросительный знак. Теоретически вы можете управлять этим с помощью пользовательского загрузчика классов, однако это может быть излишним для вашего проекта.

Самый простой будет просто удалить ваш implementation("org.apache.commons:commons-collections4:4.2") зависимость и переписать затронутый код для использования синтаксиса Commons Collections 3.

В качестве альтернативы вам придется пересмотреть способ использования JMeter в своем приложении и перейти к одному из альтернативных вариантов выполнения JMeter.

Другие вопросы по тегам