2014-11-22 7 views
2

Я пытаюсь развернуть свое приложение на OpenShift (JBoss Enterprise Application Platform 6), и я получил NoSuchMethodError, упомянутый в названии. Таким образом, я разобрал все это и нашел несколько статей или потоков, в которых упоминалось, что этот метод доступен с JPA-API 2.1. Я узнал, что зависимость, которая необходима для Openshift, содержит JPA-API 2.0. Я пытался исключить эту зависимость, но она не работает. Есть идеи? Пожалуйста, найдите pom.xml ниже.NoSuchMethodError: javax.persistence.JoinColumn.foreignKey()

<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/maven-v4_0_0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>christmasmarkets</groupId> 
<artifactId>christmasmarkets</artifactId> 
<packaging>war</packaging> 
<version>1.0</version> 
<name>christmasmarkets</name> 
<repositories> 
    <repository> 
     <id>eap</id> 
     <url>http://maven.repository.redhat.com/techpreview/all</url> 
     <releases> 
      <enabled>true</enabled> 
     </releases> 
     <snapshots> 
      <enabled>true</enabled> 
     </snapshots> 
    </repository> 
    <repository> 
     <id>springsource-repo</id> 
     <name>SpringSource Repository</name> 
     <url>http://repo.springsource.org/release</url> 
    </repository> 
</repositories> 
<pluginRepositories> 
    <pluginRepository> 
     <id>eap</id> 
     <url>http://maven.repository.redhat.com/techpreview/all</url> 
     <releases> 
      <enabled>true</enabled> 
     </releases> 
     <snapshots> 
      <enabled>true</enabled> 
     </snapshots> 
    </pluginRepository> 
</pluginRepositories> 
<properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
    <maven.compiler.source>1.6</maven.compiler.source> 
    <maven.compiler.target>1.6</maven.compiler.target> 
    <spring.version>4.1.2.RELEASE</spring.version> 
    <hibernate.version>4.3.7.Final</hibernate.version> 
    <hibernate-annotations.version>3.5.6-Final</hibernate-annotations.version> 
    <hibernate-commons-annotations.version>3.2.0.Final</hibernate-commons-annotations.version> 
    <jackson.version>2.2.3</jackson.version> 
    <postgre.version>9.3-1102-jdbc41</postgre.version> 
</properties> 
<dependencies> 
    <dependency> 
     <groupId>org.jboss.spec</groupId> 
     <artifactId>jboss-javaee-6.0</artifactId> 
     <version>3.0.2.Final-redhat-4</version> 
     <type>pom</type> 
     <scope>provided</scope> 
     <exclusions> 
      <exclusion> 
       <groupId>org.hibernate.javax.persistence</groupId> 
       <artifactId>hibernate-jpa-2.0-api</artifactId> 
      </exclusion> 
     </exclusions> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-context</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-web</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-webmvc</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-tx</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.springframework</groupId> 
     <artifactId>spring-orm</artifactId> 
     <version>${spring.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-core</artifactId> 
     <version>${jackson.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-databind</artifactId> 
     <version>${jackson.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>com.fasterxml.jackson.core</groupId> 
     <artifactId>jackson-annotations</artifactId> 
     <version>${jackson.version}</version> 
    </dependency> 
    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>${hibernate.version}</version> 
    </dependency> 

    <dependency> 
     <groupId>org.postgresql</groupId> 
     <artifactId>postgresql</artifactId> 
     <version>${postgre.version}</version> 
    </dependency> 

</dependencies> 
<profiles> 
    <profile> 
     <!-- When built in OpenShift the 'openshift' profile will be used when 
      invoking mvn. --> 
     <!-- Use this profile for any OpenShift specific customization your app 
      will need. --> 
     <!-- By default that is to put the resulting archive into the 'deployments' 
      folder. --> 
     <!-- http://maven.apache.org/guides/mini/guide-building-for-different-environments.html --> 
     <id>openshift</id> 
     <build> 
      <finalName>christmasmarkets</finalName> 
      <plugins> 
       <plugin> 
        <artifactId>maven-war-plugin</artifactId> 
        <version>2.1.1</version> 
        <configuration> 
         <outputDirectory>deployments</outputDirectory> 
         <warName>ROOT</warName> 
        </configuration> 
       </plugin> 
      </plugins> 
     </build> 
    </profile> 
</profiles> 

ответ

2

Проблема здесь состоит в том, что JPA 2.0 обеспечивается во время выполнения контейнером. Исключение предоставленной зависимости в pom.xml имеет эффект только во время компиляции. Чтобы решить эту проблему, вы должны настроить загрузку классов в контейнер. поддержка

OpenShift JavaEE 6 базируется на JBoss AS 7. Из Class Loading in AS7 документации:

jboss-deployment-structure.xml is a JBoss specific deployment descriptor that can be used to control class loading in a fine grained manner. It should be placed in the top level deployment, in META-INF (or WEB-INF for web deployments). It can do the following:

Prevent automatic dependencies from being added 
    Add additional dependencies 
    ... 

Так что вам нужно, это добавить файл пользовательского jboss-deployment-structure.xml исключить hibernate-jpa-2.0-api от добавления автоматически.

на основе OpenShift's documentation:

<jboss-deployment-structure> 
    <deployment> 
     <exclusions> 
     <module name="javax.persistence.api" /> 
     </exclusions> 
    </deployment> 
</jboss-deployment-structure> 
+0

, где я должен поместить этот XML-файл? –

+1

@ H.Aqjn «Он должен быть размещен в развертывании верхнего уровня в META-INF (или WEB-INF для веб-развертывания)» –

0

Добавить эту зависимость Maven для вашего pom.xml:

<dependency> 
    <groupId>org.hibernate.javax.persistence</groupId> 
    <artifactId>hibernate-jpa-2.1-api</artifactId> 
    <version>1.0.0.Final</version> 
</dependency> 
Смежные вопросы