programing

스프링 부팅이 maven-surefire-plugin ClassNotFoundException org.apache.maven을 실행할 수 없습니다.확실해요.booter.ForkedBooter

closeapi 2023. 4. 6. 21:41
반응형

스프링 부팅이 maven-surefire-plugin ClassNotFoundException org.apache.maven을 실행할 수 없습니다.확실해요.booter.ForkedBooter

Spring Boot 2.0.2의 maven(3.5.2) 빌드를 실행합니다.RELEASE 어플리케이션(Web 의존관계를 가진 Web 이니셜라이저에 의해 생성됨)은 maven-surefire-plugin 실행에 실패하고 다음과 같이 표시됩니다.

오류: 주 클래스 org.apache.maven을 찾거나 로드할 수 없습니다.확실해요.booter.ForkedBooter

원인: java.lang.ClassNotFoundException: org.apache.maven.확실해요.booter.ForkedBooter

왜 이런 일이 생기는 건가요?부팅 + Surefire Integration = 버그에 문제가 있습니까?

참고로 관련성이 있다고 생각되는 의존관계는 다음과 같습니다.

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.2.RELEASE</version>
    <relativePath/>
</parent>
...
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
</dependency>
...
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
</dependency>
...
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

이 문제의 회피책은 Spring Boot를 덮어쓰는 것입니다.maven-surefire-plugin정의와 세트useSystemClassLoader로.false자세한 내용은 Surefire 문서를 참조하십시오.

<build>
    <plugins>
        ...
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <useSystemClassLoader>false</useSystemClassLoader>
            </configuration>
        </plugin>
    </plugins>
</build>

<useSystemClassLoader>false</useSystemClassLoader>Jediz가 제공한 솔루션은 확실한 테스트를 실행할 수 있었지만 일부 스프링 부트 통합 테스트에서 클래스 로딩이 중단되었습니다.

다음과 같은 maven-sure-fire-plugin 구성을 사용할 수 있었습니다.

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <configuration>
        <argLine>-Djdk.net.URLClassPath.disableClassPathURLCheck=true</argLine>
    </configuration>
</plugin>

이는 Maven Surefire 플러그인의 알려진 버그로 인해 발생합니다.2018년 11월에 출시된 3.0.0-M1 버전에서 수정되었습니다.따라서 가장 간단하고 신뢰성 높은 수정은 사용하는 플러그인의 버전을 업그레이드하는 것입니다.

저는 maven-sure-fire-plugin을 2.12.4에서 3.0.0-M1로 업데이트한 것이 효과가 있었습니다.프로젝트에서 플러그인을 명시적으로 사용하지 않았기 때문에 새 플러그인 종속성을 추가해야 했습니다.

<plugins>
   ...
   <plugin>
      <artifactId>maven-surefire-plugin</artifactId>
      <version>3.0.0-M1</version>
   </plugin>
   ...
</plugins>

나에게 해결책은 mvn을 실행시키는 것이었다.

_JAVA_OPTIONS=-Djdk.net.URLClassPath.disableClassPathURLCheck=true mvn clean compile package

기타 아이디어(시스템 속성을 maven 인수 목록에 제공, 다른 변경 사항)pom.xml,settings.xml)는 동작하지 않았다.

이 답변은 정확한 솔루션을 포함하고 있지 않지만, Ubuntu JDK와 Maven Surefire Plugin의 2개의 독립된 단독 무해한 버그에 의한 유감스러운 협력이라는 점을 명확히 하는 데 큰 도움이 되었습니다.

JDK와 Maven 버전이 같은 최근의 Debian(버스터)은 이 문제에 영향을 받지 않는 것 같습니다만, Ubuntu(xenial)는 영향을 받았습니다.

정확한 해결책은 이 답변에서 나온다.

미래로부터의 갱신: Debian Buster는 모든 것이 정상이며, 이 회피책은 더 이상 필요하지 않습니다.

이것을 POM의 상부에 추가한 후에, maven surefire-plugin을 POM에서 삭제할 수 있었습니다(내부).<project>노드)의 디세이블랙아웃)

<prerequisites>
    <maven>3.6.3</maven>
</prerequisites>

왜 이게 정답이라고 생각하죠?

  • Maven이 사용할 것을 권장하는 Maven 버전을 지정합니다.https://maven.apache.org/download.cgi
  • 「」를 선택합니다.mvn versions:display-plugin-updatesSuper-pom maven-sure-fire-plugin 3.0.0-M3 입니다.이 문제는 해결된 것 같습니다.
  • 향후 개별 플러그인 버전을 개별적으로 관리할 필요는 없습니다.슈퍼폼 버전을 제어하는 최소 메이븐 버전입니다.

이것을 maven-sure-fire 플러그인에 추가하여 문제를 해결했습니다.

<plugin>    
  <groupId>org.apache.maven.plugins</groupId>   
  <artifactId>maven-surefire-plugin</artifactId>    
  <configuration>
    <forkCount>0</forkCount>
  </configuration>
</plugin>

언급URL : https://stackoverflow.com/questions/50661648/spring-boot-fails-to-run-maven-surefire-plugin-classnotfoundexception-org-apache

반응형