NoClassDefFoundError for Gradle fat jar with tests Spring Boot
NoClassDefFoundError for Gradle fat jar with tests Spring Boot
我需要在 Gradle 项目中创建 fat jar 并测试 Main 方法在 src/test 下。
我现在有
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/CommandLineParser
当我 运行 由 'gradle bootJar' 创建的 fat jar 时。
我的Gradle:
plugins {
id 'org.springframework.boot' version '2.1.7.RELEASE'
}
apply plugin: 'io.spring.dependency-management'
dependencies {
compile group: 'org.springframework', name: 'spring-context', version: '5.1.9.RELEASE'
compile group: 'org.springframework', name: 'spring-web', version: '5.1.9.RELEASE'
compile group: 'org.springframework', name: 'spring-aop', version: '5.1.9.RELEASE'
compile group: 'org.springframework', name: 'spring-aspects', version: '5.1.9.RELEASE'
compile group: 'org.springframework', name: 'spring-test', version: '5.0.5.RELEASE'
compile group: 'commons-cli', name: 'commons-cli', version: '1.4'
}
bootJar {
manifest {
attributes 'Start-Class': 'com.company.MainRunner'
}
from sourceSets.test.output.classesDirs
}
我的spring.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true" xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<aop:aspectj-autoproxy/>
<bean> ... </bean>
<bean> ... </bean>
</beans>
异常:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/CommandLineParser
在我将 AspectJ 添加到项目之前,之前遵循 'gradle shadowJar' 的代码运行良好
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:4.0.3'
}
}
apply plugin: 'com.github.johnrengelman.shadow'
shadowJar {
manifest {
attributes 'Main-Class': 'com.company.MainRunner'
}
from sourceSets.test.output.classesDirs
configurations = [project.configurations.testRuntime]
}
错误出现在 运行ning 'gradle shadowJar'
Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/aop]
我在某处发现 shadowJar 无法与 Spring
一起正常工作
如何为 Spring 项目在 src/test 下的主要 class 创建 fat jar?
Exception in thread "main" java.lang.NoClassDefFoundError:
org/apache/commons/cli/CommandLineParser
根据上述错误,您的类路径中似乎缺少库 (Apache Commons-CLI)。因此,添加该库并重试。
关于这个错误,
Unable to locate Spring NamespaceHandler for XML schema namespace
[http://www.springframework.org/schema/aop]
使用 aop
命名空间而类路径上没有必要的 aop
spring 库时会出现问题。
但我看到你已经导入了那个库。
另一个原因是您正在尝试创建一个 fat.jar 文件,因此在将多个 spring 依赖项合并到一个 jar 文件中时 spring.handlers / spring.schemas
被覆盖。
所以我建议使用Apache Maven Shade Plugin and rebuild the project. And this is the Gradle version of Apache Maven's Shade Plugin。
这个 Gradle shadowJar 适合我
import com.github.jengelman.gradle.plugins.shadow.transformers.AppendingTransformer
shadowJar {
mergeServiceFiles()
transform(AppendingTransformer) { resource = 'META-INF/spring.handlers' }
transform(AppendingTransformer) { resource = 'META-INF/spring.schemas' }
manifest {
attributes 'Main-Class': 'com.company.MainRunner'
}
from sourceSets.test.output.classesDirs
configurations = [project.configurations.testRuntime]
}
我需要在 Gradle 项目中创建 fat jar 并测试 Main 方法在 src/test 下。
我现在有
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/CommandLineParser
当我 运行 由 'gradle bootJar' 创建的 fat jar 时。
我的Gradle:
plugins {
id 'org.springframework.boot' version '2.1.7.RELEASE'
}
apply plugin: 'io.spring.dependency-management'
dependencies {
compile group: 'org.springframework', name: 'spring-context', version: '5.1.9.RELEASE'
compile group: 'org.springframework', name: 'spring-web', version: '5.1.9.RELEASE'
compile group: 'org.springframework', name: 'spring-aop', version: '5.1.9.RELEASE'
compile group: 'org.springframework', name: 'spring-aspects', version: '5.1.9.RELEASE'
compile group: 'org.springframework', name: 'spring-test', version: '5.0.5.RELEASE'
compile group: 'commons-cli', name: 'commons-cli', version: '1.4'
}
bootJar {
manifest {
attributes 'Start-Class': 'com.company.MainRunner'
}
from sourceSets.test.output.classesDirs
}
我的spring.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans default-lazy-init="true" xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.3.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
<aop:aspectj-autoproxy/>
<bean> ... </bean>
<bean> ... </bean>
</beans>
异常:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/CommandLineParser
在我将 AspectJ 添加到项目之前,之前遵循 'gradle shadowJar' 的代码运行良好
buildscript {
repositories {
jcenter()
mavenCentral()
}
dependencies {
classpath 'com.github.jengelman.gradle.plugins:shadow:4.0.3'
}
}
apply plugin: 'com.github.johnrengelman.shadow'
shadowJar {
manifest {
attributes 'Main-Class': 'com.company.MainRunner'
}
from sourceSets.test.output.classesDirs
configurations = [project.configurations.testRuntime]
}
错误出现在 运行ning 'gradle shadowJar'
Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/aop]
我在某处发现 shadowJar 无法与 Spring
一起正常工作如何为 Spring 项目在 src/test 下的主要 class 创建 fat jar?
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/cli/CommandLineParser
根据上述错误,您的类路径中似乎缺少库 (Apache Commons-CLI)。因此,添加该库并重试。
关于这个错误,
Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/aop]
使用 aop
命名空间而类路径上没有必要的 aop
spring 库时会出现问题。
但我看到你已经导入了那个库。
另一个原因是您正在尝试创建一个 fat.jar 文件,因此在将多个 spring 依赖项合并到一个 jar 文件中时 spring.handlers / spring.schemas
被覆盖。
所以我建议使用Apache Maven Shade Plugin and rebuild the project. And this is the Gradle version of Apache Maven's Shade Plugin。
这个 Gradle shadowJar 适合我
import com.github.jengelman.gradle.plugins.shadow.transformers.AppendingTransformer
shadowJar {
mergeServiceFiles()
transform(AppendingTransformer) { resource = 'META-INF/spring.handlers' }
transform(AppendingTransformer) { resource = 'META-INF/spring.schemas' }
manifest {
attributes 'Main-Class': 'com.company.MainRunner'
}
from sourceSets.test.output.classesDirs
configurations = [project.configurations.testRuntime]
}