创建了Spring Boot Jar。运行但失败`DataSourceProperties $ DataSourceBeanCreationException:无法确定合适的驱动程序类`IntelliJ

时间:2019-02-23 18:36:02

标签: java maven spring-boot intellij-idea jar


该问题已被编辑,请查看“更新”部分以及我为寻求解决方案而采用的所有不同方式。


初始问题

我尝试为我的项目创建可执行jar文件,但是尝试运行no main manifest attribute, in kerkinibackend.jar时遇到错误。

该项目是一个Spring Boot应用程序,我正在使用IntelliJ作为IDE。

我试图找到最常见的情况,因为类似的问题可能会发生这种情况,但是我无法使其工作。

我采取的步骤是:

  1. 打开IntelliJ。
  2. 在右上角的图标上打开项目的结构。
  3. 已导航至工件。
  4. 按下加号以添加新的工件。
  5. JAR->来自具有依赖性的模块。 (在拥有MANIFEST.MF文件时,也使用了空白选项进行了尝试,该文件是从我第一次尝试时自动生成的。)
  6. 在弹出对话框中打开Main类的文件夹并指定它。 (也尝试在我在某处阅读时将Main类留空,并使其保持连接状态 通过清单)。
  7. 将其余的保留为默认值。 (以这种方式,IntelliJ还会创建所需的清单,以防您已经删除了该文件,从而可以再次生成它)
  8. 然后,我按下Build-> Build Artifacts-> Build。
  9. 创建的大小为57Mbs。我尝试将其作为可执行文件运行,但我发现它无法正常工作。然后,我打开cmd并运行java -jar kerkinibackend.jar,然后出现错误消息。事实是MANIFEST.MF文件实际上是在src/main/java/META-INF中创建的
Manifest-Version: 1.0
Main-Class: com.teicm.kerkinibackend.KerkinibackendApplication

我在pom.xml中也确实有需要的依赖项

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>





更新

我通过将清单的默认生成更改为在资源中来解决此问题。

现在Jar运行了,但是我从Spring No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.那里得到了错误









进一步更新

我试图在资源文件夹的META-INF文件夹内添加一个额外的文件spring.factories(作为另一个答案Relevant question-answer的读物),以解决前面的问题。现在,它没有显示相同的错误,但是显示了一个不同的

00:24:26.230 [main] ERROR org.springframework.boot.SpringApplication - Application run failed
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaConfiguration': Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceConfiguration$Hikari.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.zaxxer.hikari.HikariDataSource]: Factory method 'dataSource' threw exception; nested exception is org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException: Failed to determine a suitable driver class
        at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:767)
        at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:218)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1308)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1154)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
        at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:391)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1288)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1127)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:538)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:498)
        at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199)
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1083)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:853)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:546)
        at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775)
        at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:316)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248)
        at com.teicm.kerkinibackend.KerkinibackendApplication.main(KerkinibackendApplication.java:11)

但是我不知道这是否使我更近了一步。以及为什么不能识别MySQL数据源。当我在本地使用该项目时,一切正常,它连接到MySQL,并且与前端通信。





使用maven-assembly-plugin

尝试其他构建方法

我还尝试通过@Zsolt Tolvary的方法使用另一种方式来构建可执行jar(您可以在link上找到有关它的更多信息)。这种方法在pom.xml中使用了另一个名为maven-assembly-plugin的插件。

不幸的是,执行建议的步骤确实会生成一个jar文件,但是当我尝试运行/target文件夹中现在存在的生成的jar时,我会收到一条Error: Could not find or load main class com.teicm.kerkinibackend.KerkinibackendApplication的错误消息,该错误当然已经改变在插件中Main类的名称:

<build>
        <plugins>
            <plugin>
                    <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <finalName>KerkiniBackEnd</finalName>
                    <appendAssemblyId>false</appendAssemblyId>
                    <archive>
                        <manifest>
                            <mainClass>com.teicm.kerkinibackend.KerkinibackendApplication</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>





对于任何有空余时间的人,请随时向我提出解决方案,甚至亲自尝试。我真的需要生成它,这是完成论文的最后一部分...

Github存储库的链接为Github Repository

感谢您的时间和精力

1 个答案:

答案 0 :(得分:3)

@khmarbaise上面给出的答案是正确的,并且是成功创建Spring Boot可启动jar的关键。

我只是在提供其他信息,希望进一步为您澄清一些关键的相关事项。 (我会在评论中添加此内容,但由于这是我的第一篇出版物,因此发表评论需要50个信誉点中的0分;另一方面,我可以自由发布答案-“启动”我自己的问题:-)

首先,您没有列出您的初始IntelliJ步骤。程序集插件的用法也没有(下面更多内容)。

只要您在spring-boot-maven-plugin中定义了pom.xml(假设您还已经将目标“包装”定义为“ jar”,这两个都已经完成),则Maven与运行Maven软件包命令:mvn clean package

时,Spring将产生可引导的jar文件。

@khmarbaise也指出,由于测试失败,目前需要指示Maven跳过测试执行,这将阻止可启动jar的“打包”成功完成:mvn clean package -DskipTests

顺便说一句,IntelliJ包括一个方便的Maven“工具窗口”,它使您可以从IDE中运行类似这些的Maven命令。如果未显示,请转到视图->工具窗口,然后选择“ Maven”。

Spring Boot应用程序本身被“汇编”为“主要方法” jar文件。这就是为什么尝试使用maven-assembly-plugin来构建Spring Boot应用程序/ jar毫无意义的原因(或者是可行的,因为Spring Boot在jar内创建了一个不同的内部结构,Spring Boot需要运行该内部结构)。

如果打包成功完成,您应该在“ compiler output”目录下看到以下一对jar文件(通常位于[PROJECT_ROOT_DIR]/target)

kerkinibackend-0.0.1-SNAPSHOT.jar
kerkinibackend-0.0.1-SNAPSHOT.jar.original

浏览MANIFEST.MF的{​​{1}}文件,您会看到几个关键条目:

kerkinibackend-0.0.1-SNAPSHOT.jar

这是如何工作的:当使用Main-Class: org.springframework.boot.loader.JarLauncher Start-Class: com.teicm.kerkinibackend.KerkinibackendApplication 标志调用JVM时,它将在-jar中搜索MANIFEST.MF条目。在这种情况下,它将找到Spring的Main-Class类作为应调用其JarLauncher方法来启动应用程序的类。 main随后将查找清单的JarLauncher条目,该条目已填充到Start-Class类的完全限定路径:(@SpringBootApplication),并将最终致电com.teicm.kerkinibackend.KerkinibackendApplication上的main

KerkinibackendApplication

希望此信息有助于弄清某些事情。如果没有,请告诉我。祝您好运,并祝贺您(几乎)完成论文!