我正在使用maven作为构建工具创建一个spring-boot应用程序。
我遇到了一个问题,我想创建一个.war文件并将其部署到一个专用的jetty实例。
我得到的错误如下:
无法实例化日志:工厂方法'dataSource‘引发异常;嵌套异常为java.lang.NoClassDefFoundError: org/apache/juli/javax.sql.DataSource/LogFactory。
当我通过排除org.apache.juli -org.apache.juli-starter.jdbc中的依赖项来删除对Spring库的依赖项时,这个问题就解决了:
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
</exclusion>
</exclusions>
</dependency>排除此库将使war在当前版本的jetty上运行(jetty-distribution-9.3.8.v20160314)。
但是:当我尝试启动JAVA应用程序时,比如使用main和嵌入式jetty服务器,它崩溃了,并显示以下消息:
Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.NoClassDefFoundError: org/apache/juli/logging/LogFactory.通过再次包含org.apache.toimcat -> tomcat.juli,我可以通过main方法再次启动它,但不能构建在jetty实例上运行的.war文件...
我的主类包含以下两个方法(并使用@SpringBootApplication注释):
protected SpringApplicationBuilder configure(SpringApplicationBuilder app) {
application.sources(App.class);
return super.configure(app);
}
public static void main(String[] args) throws Exception {
SpringApplication.run(App.class, args);
}有人能帮我把这个/指向正确的方向吗?我想对.war和独立使用使用相同的配置。
POM.xml:`Thank你的答案,pom.xml在下面的评论中:
<?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>my.company</groupId>
<artifactId>testing</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<java.version>1.8</java.version>
<start-class>my.company.App</start-class>
</properties>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.3.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<!-- Additional lines to be added here... -->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<!-- <exclusions>
<exclusion>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-juli</artifactId>
</exclusion>
</exclusions>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-hateoas</artifactId>
</dependency>
<!-- com.oracle -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency>
</dependencies>
</project>发布于 2017-11-02 17:56:32
通常,没有办法同时为“.war”和可执行文件“.jar”配置单一的pom.xml,并具有适当的依赖项管理差异。虽然我知道你想把它开发和测试为可执行文件,同时部署为'.war‘。
完美的解决方案是使用Maven配置文件。因此,您可以使用'.war‘打包默认配置文件,但不包括juli。你可以有一些“JarExecutable”配置文件,你可以把它包括回去,并描述与默认的所有其他区别。
其他的解决方案也不是那么糟糕,通常也很有帮助,它配置了Jetty所提供的所有依赖项。Spring Boot打包将其包含到可执行jars中,而在打包'.war‘时省略它们(或者打包到单独的目录,默认情况下不包括在类路径中)。
https://stackoverflow.com/questions/36590159
复制相似问题