2015-12-02 1 views
0

Im программирует REST API с весенней загрузкой, которая использует некоторые внешние библиотеки, которые включены через зависимость в моем pom.xml. Если я запустил проект в IntelliJ через mvn spring-boot: запустите все работает отлично, но если я попытаюсь упаковать все в банку через mvn package, то все внешние зависания calsses отсутствуют, за исключением пружинных ботинок. Однако соответствующие jarfiles копируются в папку lib jar. Так что, если я Начинайте банку все работает просто отлично (отвечая на GetRequests и т.д.) Но как только я хочу, чтобы инициализировать переменную типа FFmpegFrameGrabber (который из bytedeco) я получаю NoClassDefFoundErrorNoClassDefFoundError spring boot maven

Моего POM выглядит следующим образом:

<?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> 

структура genrerated банка (часть его):
банки
+ привет
+ Lib
+ META-INF
+ орг
---- + springframework
---- + ЗДЕСЬ shoould быть bytedeco (?)

Заранее спасибо

EDIT: Minimal (Не) рабочий пример

package hello; 

import org.bytedeco.javacv.FFmpegFrameGrabber; 
import org.springframework.web.bind.annotation.RestController; 
import org.springframework.web.bind.annotation.RequestMapping; 

@RestController 
public class HelloController { 

    @RequestMapping("/") 
    public String index() { 
     String path = "D:\\TestVideos\\1\\original.mp4"; 
     FFmpegFrameGrabber frameGrabber; 
     System.out.println("Starting Frame Grabber for: " + path); 
     frameGrabber = new FFmpegFrameGrabber(path); 
     try { 
      frameGrabber.start(); 
     } catch (Exception e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

     return "Greetings from Spring Boot! Opening: " + path; 
    } 

} 

И 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); 
     } 
    } 

} 

Это прямо из учебника по весеннему ботинку. резервуары снова

+1

Я не знаком с bytedeco, но баночка должна также быть в 'lib' папку вашего Jar и все его классы должны быть доступны , Возможно, это что-то необычное? Можете ли вы предоставить небольшой образец, который воспроизводит проблему? –

+0

Его оболочка hava для ffmpeg. Все баночки ffmpeg находятся в libfolder, но не файлы классов в соответствующих местах. – TheElk

ответ

0

Добавить плагин ниже в разделе pom.xml<build><plugins> ... </plugins></build>. Создайте проект maven и выполните команду jar. Этот плагин упакует все ваши зависимые банки в финальную исполняемую банку.

 <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <version>2.6</version> 
      <configuration> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
     </plugin> 

Эта страница содержит больше информации о Maven сборки плагин - https://maven.apache.org/plugins/maven-assembly-plugin/usage.html

+0

Это не работает, потому что это любопытно путается по пути для весеннего ботинка. Обычно, spring-boot: repackage настраивает эти имена в банке, сгенерированной maven (если я прав). Поэтому мне нужно будет вызвать весеннюю загрузку: переупаковка на банке с зависимостями. Есть идеи? Ошибка при запуске jar с dependecies: org.springframework.context.ApplicationContextException: Не удалось запустить embedde d контейнер; Вложенное исключение - org.springframework.context.ApplicationContextE xception: Не удается запустить EmbeddedWebApplicationContext из-за отсутствия встроенных объектов ervletContainerFactory bean. – TheElk

+0

ОК. Вы попробовали [this] (https: //docs.spring.io/spring-boot/docs/current/reference/html/build-tool-plugins-maven-plugin.html) –

+0

да, я сделал. Все еще не работает :/ – TheElk