Java NoClassDefFoundErrorSpring引导maven
我用SpringBoot编写了一个RESTAPI,它使用了一些外部库,这些库通过依赖关系包含在我的pom.xml中。 如果我通过mvn-spring-boot:run在IntelliJ中启动项目,一切正常,但是如果我试图通过mvn-package将所有内容打包到一个jar中,除了spring-boot之外,所有外部依赖性都会丢失。但是,相应的jar文件被复制到jar的lib文件夹中。 因此,如果我启动jar,一切正常(回答getRequests等),但只要我想初始化类型为FFmpegFrameGrabber(来自bytedeco)的变量,我就会得到一个NoClassDefFoundError 我的POM如下所示:Java NoClassDefFoundErrorSpring引导maven,java,maven,spring-boot,dependencies,noclassdeffounderror,Java,Maven,Spring Boot,Dependencies,Noclassdeffounderror,我用SpringBoot编写了一个RESTAPI,它使用了一些外部库,这些库通过依赖关系包含在我的pom.xml中。 如果我通过mvn-spring-boot:run在IntelliJ中启动项目,一切正常,但是如果我试图通过mvn-package将所有内容打包到一个jar中,除了spring-boot之外,所有外部依赖性都会丢失。但是,相应的jar文件被复制到jar的lib文件夹中。 因此,如果我启动jar,一切正常(回答getRequests等),但只要我想初始化类型为FFmpegFrameG
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>spring-boot-test</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.2.7.RELEASE</version>
</parent>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.1</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
以及Application.java
package hello;
import java.util.Arrays;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
ApplicationContext ctx = SpringApplication.run(Application.class, args);
System.out.println("Let's inspect the beans provided by Spring Boot:");
String[] beanNames = ctx.getBeanDefinitionNames();
Arrays.sort(beanNames);
for (String beanName : beanNames) {
System.out.println(beanName);
}
}
}
这是直接从春季开机教程。
再次在您的
pom.xml
中添加下面的插件代码>部分。
构建maven项目并执行jar命令。
这个插件将把所有依赖的jar打包到最终的可执行jar中
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
我不熟悉bytedeco,但它的jar也应该在jar的lib
文件夹中,并且它的所有类都应该可用。也许它做了一些不寻常的事?你能提供一个重现问题的小样本吗?它是ffmpeg的hava包装器。所有的ffmpeg JAR都在libfolder中,但在适当的位置没有类文件。这不起作用,因为它会把spring引导的路径弄乱。通常,springboot:repackage会在maven生成的jar中调整这些名称(如果我是正确的话)。因此,我需要调用springboot:使用依赖项在jar上重新打包。有什么想法吗?使用dependecies启动jar时出错:org.springframework.context.ApplicationContextException:无法启动嵌入式容器;嵌套异常为org.springframework.context.applicationContext异常:由于缺少EmbeddedS ervletContainerFactory bean.ok,无法启动EmbeddedWebApplicationContext。你试过了吗
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.6</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>