компиляция spring-boot использует jdk 1.7, но запускает использование 1.6

Я компилирую приложение весенней загрузки, используя jdk 1.7, в файл application.jar, но когда я запускаю application.jar на машине, на которой установлен jdk 1.6, возникает эта ошибка

Исключение в потоке «основной» java.lang.UnsupportedClassVersionError: com/saifiahmada/spring/Application: неподдерживаемая версия major.minor 51.0

это мой pom.xml

<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>com.saifiahmada.spring</groupId>
<artifactId>dashboard</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>dashboard tsd</name>
<description>dashboard tsd</description>
<packaging>jar</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.2.1.RELEASE</version>
</parent>

<properties>
    <webjars-bootstrap.version>3.2.0</webjars-bootstrap.version>
    <webjars-jquery-ui.version>1.9.2</webjars-jquery-ui.version>
    <webjars-jquery.version>2.1.1</webjars-jquery.version>
    <java.version>1.6</java.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <maven.compiler.target>${java.version}</maven.compiler.target>
    <tomcat.version>7.0.59</tomcat.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-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.9</version>
    </dependency>

    <dependency>
        <groupId>org.scala-lang</groupId>
        <artifactId>scala-library</artifactId>
        <version>2.10.4</version>
    </dependency>
    <dependency>
        <groupId>commons-fileupload</groupId>
        <artifactId>commons-fileupload</artifactId>
        <version>1.3.1</version>
    </dependency>

</dependencies>
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <!-- <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration> -->
            <dependencies>
                <dependency>
                    <groupId>org.springframework</groupId>
                    <artifactId>springloaded</artifactId>
                    <version>1.2.0.RELEASE</version>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

thanks

[править] на @Saurabh, я меняю зависимость в своем pom.xml для spring-boot-starter-data-jpa, например:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>javax.transaction</groupId>
                    <artifactId>javax.transaction-api</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
<dependency>
            <groupId>org.jboss.spec.javax.transaction</groupId>
            <artifactId>jboss-transaction-api_1.1_spec</artifactId>
            <version>1.0.0.Final</version>
</dependency>

person sahmada    schedule 11.03.2015    source источник
comment
Ваш POM выглядит нормально. Вы уверены, что это Maven создает файлы классов (возможно, у вас также открыт проект в IDE)?   -  person Dave Syer    schedule 11.03.2015
comment
Как сказал @DaveSyer, похоже, что он был скомпилирован не с java 1.6, а с java 1.7 (версия 51.0 означает java 7, см. здесь). Возможно, вы строите его с помощью какого-то другого инструмента. Или вы построили его с помощью maven clean package?   -  person buftlica    schedule 11.03.2015
comment
@MatkoMedenjak: вы правы, я использую команду mvn package для компиляции этого весеннего загрузочного приложения для создания файла jar. Благодарим всех   -  person sahmada    schedule 12.03.2015
comment
@DaveSyer: да, конечно   -  person sahmada    schedule 12.03.2015


Ответы (2)


Проблема, с которой вы столкнулись, заключается в том, что для одной из ваших зависимостей требуется некоторый jar, скомпилированный для Java 7 (javax.transaction-api-1.2.jar)

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

Пожалуйста, взгляните на это, в котором описывается, как запустить Spring Boot на Java 6:

http://docs.spring.io/spring-boot/docs/1.2.2.RELEASE/reference/htmlsingle/#howto-use-java-6

Важный бит, приведенный здесь для справки:

«Хотя сам Java Transaction API не требует Java 7, официальный jar API содержит классы, которые были созданы для использования Java 7. Если вы используете JTA, вам нужно будет заменить официальный jar API JTA 1.2 на тот, который был создан для работы с Java 6. Для этого исключите все транзитивные зависимости от javax.transaction:javax.transaction-api и замените их зависимостью от org.jboss.spec.javax.transaction:jboss-transaction-api_1.2_spec: 1.0.0.Финал"

Также загляните сюда:

http://docs.spring.io/spring-boot/docs/1.2.2.RELEASE/reference/htmlsingle/#getting-started-system-requirements

Я понимаю, что вы используете Spring Boot 1.2.1, и все мои ссылки относятся к 1.2.2, но вполне вероятно, что эта проблема существовала и в версии 1.2.1, а версия 1.2.1 уже недоступна для загрузки, поэтому вы можете рассмотреть возможность обновления. Но у вас возникнут проблемы с Java 6, поэтому вы можете подумать об обновлении своей среды.

FWIW, вам даже не нужны эти строки в вашем pom.xml:

<maven.compiler.source>${java.version}</maven.compiler.source>
<maven.compiler.target>${java.version}</maven.compiler.target>
person ci_    schedule 11.03.2015
comment
спасибо за ваши советы и ссылки, я меняю свой pom.xml с исключением javax.transaction-api на spring-boot-starter-data-jpa и добавляю зависимость jboss-transaction-api_1.1_spec, и я понижаю свой jdk до openjdk 6 и создайте свое приложение с помощью команды mvn package, пока что оно хорошо работает на jdk 6, спасибо всем - person sahmada; 12.03.2015

Более новые версии Java совместимы со старыми версиями Java, но не наоборот. Таким образом, вы не можете нормально запускать код, скомпилированный с помощью JDK 7, в среде выполнения Java 6.

Лучший способ убедиться, что он работает на Java 6, — это использовать JDK 6 вместо JDK 7 для компиляции кода.

Это означает, что вам нужно будет загрузить и установить JDK 6 и убедитесь, что он используется при компиляции кода вместо JDK 7. (Примечание: JDK 6 больше не поддерживается Oracle, вы по-прежнему можете загрузить его, но Oracle требует, чтобы вы создали учетную запись для того, чтобы скачать его).

person Jesper    schedule 11.03.2015
comment
По моему опыту, вы определенно можете запускать код, скомпилированный с помощью JDK 7, в среде выполнения Java 6, если целью компилятора является Java 6. - person ci_; 11.03.2015
comment
Хорошо, но это все равно не помешает вам использовать API, которые существуют в стандартной библиотеке Java 7, но не в Java 6 — вы заметите их только во время выполнения, когда получите NoClassDefFoundError или NoSuchMethodError. - person Jesper; 11.03.2015
comment
Правильно. Но это не то, что он видит, он видит Unsupported major.minor версии 51.0, и это файл класса, скомпилированный для Java 7, и в данном конкретном случае это javax.transaction-api-1.2.jar, извлеченный одной из его зависимостей. После этого у него могут возникнуть другие проблемы, если он использует API-интерфейсы Java 7, хотя мы не можем сказать по тому, что он опубликовал. - person ci_; 11.03.2015