有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Spring启动Jar已创建。运行但失败`DataSourceProperties$DataSourceBeanCreationException:未能确定合适的驱动程序类`IntelliJ


问题已编辑,请期待更新的部分以及我处理问题的所有不同方式,以便找到解决方案


初始问题

我试图为我的项目创建一个可执行的jar文件,但在尝试运行它时出现了错误no main manifest attribute, in kerkinibackend.jar

该项目是一个Spring启动应用程序,我使用IntelliJ作为IDE

我试图从类似的问题中找出最常见的情况,但我无法让它以任何方式工作

我采取的步骤是:

  1. 打开IntelliJ
  2. 在右上角图标上打开项目的结构
  3. 导航到工件
  4. 按下加号以添加新工件
  5. 罐子->;来自具有依赖项的模块。(也尝试使用空白选项,同时有一个.MF文件,它是从我第一次尝试时自动生成的)。李>
  6. 在弹出对话框中打开主类的文件夹并指定它。 (当我在某个地方阅读时,还尝试将主类留空,并将其保持连接。) 通过舱单)
  7. 将其余部分保留为默认值。(这样IntelliJ还可以创建所需的清单,以防您已经有了清单。删除该文件将允许再次生成清单)
  8. 然后,我按下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,它与前端进行通信






使用^{尝试不同的生成方法

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

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

<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) 个答案

  1. # 1 楼答案

    上面@khmarbaise给出的答案是正确的,是成功创建Spring Boot可引导jar的关键

    我只是想提供更多的信息,希望能为你们进一步澄清一些关键的相关问题。(我本想在评论中发表这一点,但由于这是我第一次发表评论,所以发表评论所需的50个声誉分数中我只有0分——另一方面,我可以自由发表答案——我自己的“启动”问题:-)

    首先,您列出的初始IntelliJ步骤不是必需的。汇编插件的使用也是如此(下面将对此进行详细介绍)

    只要您在pom.xml中定义了spring-boot-maven-plugin(假设您也将目标“打包”定义为“jar”——这两个都已经定义了),那么在运行Maven package命令时,Maven与Spring的交互将产生一个可引导的jar文件:mvn clean package

    正如@khmarbaise还指出的,目前您需要指示Maven跳过测试执行,因为您的测试失败了,这将阻止可引导jar的“打包”成功完成:mvn clean package -DskipTests

    顺便说一下,IntelliJ包括一个方便的Maven“工具窗口”,它允许您从IDE运行类似于这些的Maven命令。如果未显示,请转到查看->;工具窗口并选择“Maven”

    Spring引导应用程序本身被“组装”为“主方法”jar文件。这就是为什么试图用maven-assembly-plugin构建一个Spring-Boot应用程序/jar是没有意义的(或者说是行不通的,因为Spring-Boot在jar内部创建了一个Spring-Boot需要运行的不同内部结构)

    如果打包成功完成,您应该在“编译器输出”目录下看到以下两个jar文件(通常位于[PROJECT_ROOT_DIR]/target)):

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

    查看kerkinibackend-0.0.1-SNAPSHOT.jarMANIFEST.MF文件,您将看到几个关键条目:

    Main-Class: org.springframework.boot.loader.JarLauncher
    Start-Class: com.teicm.kerkinibackend.KerkinibackendApplication
    
    

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

        public static void main(String[] args) {
            SpringApplication.run(KerkinibackendApplication.class, args);
        }
    

    希望这些信息有助于澄清一些事情。如果没有,请告诉我。祝你好运,祝贺你(几乎)完成了你的论文