Работает без профиля maven, ошибка с

Вот моя проблема,

Итак, вот мой профиль в pom.xml:

<profiles>
    <profile>
            <id>dev</id>
            <activation>
                <property>
                    <name>environment</name>
                    <value>dev</value>
                </property>
            </activation>
        </profile>

        <profile>
            <id>prod</id>
            <activation>
                <property>
                    <name>environment</name>
                    <value>prod</value>
                </property>
            </activation>
        </profile>
</profiles>

Когда я использую этот context.xml, мое приложение отлично работает:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"      xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee" xmlns:jd="http://www.springframework.org/schema/jdbc"
xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:sws="http://www.springframework.org/schema/web-services"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3-0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

<context:component-scan base-package="net.xxx.xxx.dao" />       

  <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
            <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
            <property name="url" value="jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:essmh" />
            <property name="username" value="*****" />
            <property name="password" value="*****" />
      </bean>

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
        <property name="persistenceUnitName" value="carfleetPersistenceUnit" />
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <tx:annotation-driven />    
</beans>    

Но я хочу иметь возможность изменить свой dataSource в зависимости от того, работаю я или разрабатываю.

Итак, вот что у меня есть сейчас:

 <beans profile="dev">
  <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
            <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
            <property name="url" value="jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1521:dev" />
            <property name="username" value="*****" />
            <property name="password" value="*****" />
      </bean>   
</beans>

<beans profile="prod">
  <bean class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close" id="dataSource">
            <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />
            <property name="url" value="jdbc:oracle:thin:@xxx.xxx.xxx.xxx:1522:prod" />
            <property name="username" value="*****" />
            <property name="password" value="*****" />
      </bean>
</beans>

<beans profile="dev, prod">

    <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
        </property>
        <property name="persistenceUnitName" value="carfleetPersistenceUnit" />
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
    </bean>

    <tx:annotation-driven />

</beans>

Я проверяю с помощью mvn -e -P prod help:active-profiles, что профиль prod активен в каждом пакете, и это так. Но в конце это не работает, и я получаю сообщение об ошибке:

Caused by : org.springframework.beans.factory.NoSuchBeanDefinitionException : No unique bean of type [javax.persistence.EntityManagerFactory] is defined: expected single bean but found 0.

Наверняка ошибка есть, потому что это единственное изменение: «приложение работает» на «приложение имеет ошибки».


ИЗМЕНИТЬ

Теперь я понимаю, что перепутал профиль Spring и профиль Maven, но все же хочу связать их 2. Поэтому для этого я помещаю свойства в свои профили pom.xml>:

<profiles>
    <profile>
            <id>dev</id>
            <properties> 
                <environment>dev</environment> 
            </properties>
        </profile>

        <profile>
            <id>prod</id>
            <properties> 
                <environment>prod</environment> 
            </properties>
        </profile>
</profiles>

И я добавляю в свой web.xml:

<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>${environment}</param-value>
</context-param>

Когда я жестко кодирую ${environment} для dev или prod, все работает отлично. Но когда я хочу иметь возможность переключиться с Maven: clean -Pprod package tomcat7:redeploy, у меня возникла следующая проблема:

IllegalArgumentException : Could not resolve placeholder 'environment' in string value "${environment}`

person Valentin Montmirail    schedule 24.07.2015    source источник
comment
та же ошибка, с пробелом или без него :/   -  person Valentin Montmirail    schedule 24.07.2015
comment
Вы уверены, что профиль maven и профиль Spring - это одно и то же?   -  person talex    schedule 24.07.2015
comment
Я вообще не уверен: / как я могу это проверить?   -  person Valentin Montmirail    schedule 24.07.2015
comment
я думаю, что проблема здесь в том, что вы не установили свойство spring.profiles.active в своем проекте, и структура Spring не может найти bean-компонент с именем EntityManagerFactory, потому что этот bean-компонент находится либо в dev, либо в prod-профиле, но вы на самом деле не устанавливаете активный профиль в проекте. вы только устанавливаете свойство maven с именем environment   -  person Nikolay Rusev    schedule 24.07.2015
comment
Вероятно, это так, потому что каждый ответ, кажется, согласен с этим:/но как это исправить:/   -  person Valentin Montmirail    schedule 24.07.2015
comment
Не могли бы вы предоставить web.xml   -  person Utkarsh    schedule 24.07.2015


Ответы (3)


Если вы используете web.xml, вы можете установить свойство context-param, которое будет указывать на вашу текущую среду. Сначала попробуйте жестко закодировать этот тег.

<context-param>
<param-name>spring.profiles.active</param-name>
<param-value>dev</param-value>
</context-param>

в вашей конфигурации web.xml, чтобы проверить, все ли будет работать нормально, а затем попробуйте установить свою собственную переменную с текущей средой. См. этот сообщение для получения дополнительной помощи.

person Nikolay Rusev    schedule 24.07.2015
comment
Это действительно работает, жестко кодируя его. Итак, теперь проблема в том, как переключить это с помощью командной строки Maven:/ - person Valentin Montmirail; 24.07.2015
comment
Используйте здесь имя профиля maven, т.е. ${environment} - person Utkarsh; 24.07.2015
comment
Я, вероятно, глуп в этом поле, но я запускаю maven с: mvn -e clean -Denvironment=prod package tomcat7:redeploy и получаю сообщение об ошибке: «Не удалось разрешить заполнитель «среда» в строковом значении ${environment}. :/ Так не должно быть? - person Valentin Montmirail; 24.07.2015
comment
ты не дурак! когда я читал о профилях в maven и spring тоже был сбит с толку. попробуйте добавить свойства не в тег ‹activation›, а в тег ‹profile› вот так: <!-- Dev Env. Properties --> <properties> <environment>dev</environment> </properties> - person Nikolay Rusev; 24.07.2015
comment
В противном случае на сервере Tomcat добавьте системное свойство с именем «spring.profiles.active», а значение должно быть «dev» или «prod». Тогда вам не нужно жестко кодировать в web.xml - person Utkarsh; 24.07.2015
comment
См. РЕДАКТИРОВАТЬ того, что я сделал, и в чем ошибка:/ - person Valentin Montmirail; 24.07.2015
comment
Хорошо, я нашел решение здесь: stackoverflow.com/questions/27566267/. Спасибо всем ребятам за помощь :) - person Valentin Montmirail; 24.07.2015

Вы смешиваете профили maven и профили spring! Это разные вещи. Ты можешь использовать

spring.profiles.active

чтобы включить профиль, который вы хотите.

person Paulo Santos    schedule 24.07.2015

Решение для EDIT: Maven: как заполнить переменную в файл web.xml

Плагин maven-war-plugin нуждается в некоторой настройке, чтобы иметь возможность фильтровать дескрипторы профиля Spring.

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-war-plugin</artifactId>
  <version>2.5</version>
  <configuration>
    <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors>
  </configuration>
</plugin>

При всем этом вы можете переключаться с профиля Maven на профиль Spring. Спасибо всем, ребята, за помощь :).

person Valentin Montmirail    schedule 24.07.2015