Spring Boot Jar создан.Запускается, но завершается с ошибкой `DataSourceProperties $ DataSourceBeanCreationException: не удалось определить подходящий класс драйвера` IntelliJ - PullRequest
0 голосов
/ 23 февраля 2019


Вопрос был отредактирован, ищите обновленные разделы и все разные способы, которыми я подошел, чтобы найти решение.


Начальный вопрос

Я попытался создать исполняемый файл JAR для моего проекта, но при попытке запустить его * я столкнулся с ошибкой no main manifest attribute, in kerkinibackend.jar.

Проект представляет собой приложение Spring Boot, и я использую IntelliJ в качестве IDE.

Я пытался найти наиболее распространенные сценарии, когда это могло произойти из аналогичных вопросов, но я не смог сделать этоработать любым способом.

Я предпринял следующие шаги:

  1. Открыл IntelliJ.
  2. Открыл структуру проекта на правом верхнем значке.
  3. Перейдите к Артефакту.
  4. Нажмите плюс, чтобы добавить новый артефакт.
  5. JAR -> из модулей с зависимостями.(также пробовал использовать пустую опцию при наличии файла MANIFEST.MF, который был автоматически сгенерирован с первого раза, когда я попробовал).
  6. Открыл папку для класса 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.









Дальнейшее ОБНОВЛЕНИЕ

Я попытался добавить дополнительный файл spring.factories (как чтение в другом ответе Актуальный вопрос-answer ) внутри папки META-INF в папке ресурсов для решения предыдущей проблемы.Теперь это не та же самая ошибка, а другая

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

Я также пытался использовать другой способ создания исполняемого файла jar, используя подход @Zsolt Tolvary s (подробнее об этом можно узнать по link ).Этот подход использует в pom.xml другой плагин под названием maven-assembly-plugin.

К сожалению, выполнение предложенных шагов генерирует файл JAR, но когда я пытаюсь запустить созданный JAR, который существует сейчас в папке /target,тогда я получаю сообщение об ошибке 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

Спасибо за ваше времяи усилия

1 Ответ

0 голосов
/ 24 февраля 2019

Ответ, данный выше @khmarbaise, является правильным и является важным ключом для успешного создания загрузочного фляги Spring Boot.

Я отвечаю только за то, чтобы предложить дополнительную информацию, которая, как мы надеемся, еще больше прояснит для вас некоторые ключевые вопросы.(Я бы поставил это в комментариях, но так как это моя первая публикация в SO, у меня 0 из 50 баллов репутации, необходимых для публикации комментариев - с другой стороны, я свободен в публикации ответов - «загрузка»)мой собственный выпуск :-)

Во-первых, перечисленные вами начальные шаги IntelliJ не нужны.Также не используется сборочный плагин (подробнее об этом ниже).

Пока у вас есть spring-boot-maven-plugin, определенный в вашем pom.xml (при условии, что у вас также есть целевая "упаковка", определенная как "jar" - как вы уже делаете), тогда взаимодействие Maven с Springприведет к загрузке файла JAR при запуске команды пакета Maven: mvn clean package

Как также заметил @khmarbaise, на данный момент вам нужно указать Maven пропустить выполнение теста, так как ваши тесты терпят неудачу, что предотвратит«упаковка» вашего загрузочного фляги от успешного завершения: mvn clean package -DskipTests

Кстати, IntelliJ включает в себя удобное «окно» инструментов Maven, которое позволяет вам запускать такие команды Maven из IDE.Если он не отображается, перейдите в View -> Tool Windows и выберите «Maven».

Сами приложения Spring Boot «собраны» как jar-файлы «основного метода».Вот почему попытка создать приложение / jar Spring Boot с maven-assembly-plugin не имеет смысла (или работает, так как Spring Boot создает другую внутреннюю структуру внутри jar, которую Spring Boot требует для запуска).

Если упаковка завершена успешно, вы должны увидеть следующую пару файлов JAR под вашим каталогом «вывода компилятора» (обычно он находится по адресу [PROJECT_ROOT_DIR]/target):

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

Просмотр в MANIFEST.MF файл kerkinibackend-0.0.1-SNAPSHOT.jar вы увидите пару ключевых записей:

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

Как это работает: Когда JVM вызывается с флагом -jar, он будет искать MANIFEST.MF для Main-Class entry. В этом случае он найдет класс Spring JarLauncher как класс, метод которого main, который он должен вызвать для запуска приложения. JarLauncher, в свою очередь, будет искать запись манифеста Start-Class, которая была заполнена.с полным путем к вашему @SpringBootApplication классу: (com.teicm.kerkinibackend.KerkinibackendApplication) и, в свою очередь, в конечном итоге вызовет main на KerkinibackendApplication:

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

Надеюсь, что эта информация поможет прояснить некоторые вещи. Если нет, дайте мне знать. Удачи и поздравляю с (почти) выполнением вашей диссертации!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...