Eclipse + maven: профиль игнорируется

Вот мой 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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>com.heliosophiclabs</groupId>
<artifactId>artifactId</artifactId>
<version>0.0.1-SNAPSHOT</version>

<profiles>
    <profile>
        <id>local</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <serverAddr>localhost</serverAddr>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <serverAddr>heliosophiclabs.com</serverAddr>
        </properties>
    </profile>
</profiles>

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

I have a config.properties file in src/main/resources, which looks like this:

serverIp=${serverAddr}

а потом делаю:

mvn clean resources:resources -Pprod

Обратите внимание, что профиль указан здесь как «prod», и все же, как бы я ни настаивал, файл config.properties после указанной выше командной строки выглядит так:

serverIp=localhost

тогда как это должно быть:

serverIp=heliosophiclabs.com

Если я укажу несуществующий профиль в этой командной строке, тогда maven выдаст мне ошибку, поэтому он определенно что-то делает.

Пожалуйста ... что я здесь делаю не так ??

РЕДАКТИРОВАТЬ:

По запросу, результат "mvn -X -Pprod install" доступен здесь, поскольку он слишком большой, чтобы размещать здесь.

И вот что я вижу:

C:\Users\Marc\workspace_mars_2\entourage>mvn -X -Pprod install > mvn.out
C:\Users\Marc\workspace_mars_2\entourage>more target\classes\config.properties
serverAddr=localhost

В entourage-0.0.1-SNAPSHOT.jar config.properties находится в корне, и его содержимое такое же, как указано выше (т.е. localhost).

Я не придумываю это!


person Marc    schedule 04.03.2015    source источник
comment
Ваш config.properties находится внутри src / main / resources wright? Вы говорите maven, что там находятся ваши ресурсы. Также вы говорите maven, что он должен фильтровать ваши ресурсы (filtering = true), то есть любой файл внутри ресурсов, у которого есть заполнитель ($ {some.property}), должен быть отфильтрован значениями, предоставленными вашими фильтрами (вы объявляете ваши фильтры в разделе фильтров в pom), свойства pom или свойства командной строки   -  person Pablo Lascano    schedule 10.03.2015
comment
Да, config.properties находится в src / main / resources, но теперь я очень запутался. Вы сказали, что у меня должно быть только свойство env, определенное в pom (например, heliosophiclabs.com/~mad /pom.xml.txt) ... а теперь вы говорите, что мне тоже нужно определить serverAddr? Я предполагаю, что все это - обходной путь для необъяснимой проблемы, связанной с тем, как я это делал с самого начала, что действительно должно работать нормально. Прав ли я, или я делал это раньше неправильно?   -  person Marc    schedule 11.03.2015
comment
Нет! serverAddr должен быть в фильтрах, а не в pom (в local.properties укажите serverAddr = localhost, в prod.properties укажите serverAddr = heliosophiclabs.com). Во-первых, у вас все хорошо, этот обходной путь - просто посмотреть, активируется ли профиль или нет, в противном случае он должен выдать ошибку, потому что maven не найдет файл $ {env} .properties для получения значений фильтров (или значение в данном случае: serverAddr). Фильтры лучше, когда у вас есть несколько значений для замены (для поддержания чистоты помпы), в вашем случае использование свойств в помпе - это нормально, но только для тестирования ...   -  person Pablo Lascano    schedule 11.03.2015
comment
Не в помпе? Итак, мне нужен другой файл? Я читаю документы maven о фильтрации, но все, что я вижу, - это первоначальный способ, который я пробовал (который не удался). В любом случае, это выглядит так, как будто профиль активирован правильно, на основе вывода отладки -X. Я делаю mvn -X process-resources -Pprod > mvn.out ... результат здесь: heliosophiclabs.com/~mad/mvn.out Как видите, [DEBUG] properties used { ... env=prod и [DEBUG] (f) buildFilters = [C:\Users\Marc\workspace_mars_2\entourage\filters\prod.properties]   -  person Marc    schedule 11.03.2015
comment
Вместо использования свойств в профиле вы можете использовать фильтр и поместить эти свойства туда как key=value. В этом случае нам нужны два фильтра, один для локального и один для prod, у каждого из них будет только одно свойство (serverAddr), но с разными значениями. Вы указали serverAddr=localhost в local.properties и serverAddr=heliosophiclabs.com в prod.properties? Простите за плохой английский?   -  person Pablo Lascano    schedule 11.03.2015
comment
Профиль активируется правильно, как я вижу buildFilters = [C:\Users\Marc\workspace_mars_2\entourage\filters\prod.properties], а maven фактически фильтрует ваши ресурсы: filtering C:\Users\Marc\workspace_mars_2\entourage\src\main\resources\config.properties to C:\Users\Marc\workspace_mars_2\entourage\target\classes\config.properties. Содержимое prod.properties должно быть serverAddr=heliosophiclabs.com, а содержимое config.properties (внутри src / main / resources) должно быть serverIp=${serverAddr}   -  person Pablo Lascano    schedule 11.03.2015
comment
Да, у меня есть два файла свойств в каталоге фильтров (local.properties и prod.properties), как вы описываете. Но откуда будет разыменовано значение ${serverAddr}? свойство serverAddr больше не определено в моем pom. Ваш английский потрясающий ... во всяком случае лучше моего испанского :)   -  person Marc    schedule 11.03.2015
comment
Значение будет разыменовано из фильтра! тот, который вы указали в разделе фильтров в вашем помпе (локальный или производственный, в зависимости от активированного профиля). Таким образом, ваши файлы должны выглядеть как this files. Если у вашего config.properties было бы больше свойств, вы можете поместить больше значений в свои фильтры (чтобы ваш pom не разрастался до больших)   -  person Pablo Lascano    schedule 12.03.2015
comment
Может быть это руководство поможет вам, хотя вы очень близки к тому, чтобы понять это правильно!   -  person Pablo Lascano    schedule 12.03.2015
comment
Ах .... так что maven фактически интерпретирует файл .properties! Извините, только что загорелась лампочка. Хорошо, теперь у меня есть именно та конфигурация, которую вы объяснили ... но я сожалею, что получаю тот же результат, что и изначально. То есть, что бы я ни поставил для аргумента -P, профиль activeByDefault используется для фильтрации. Последний mvn.out: heliosophiclabs.com/~mad/mvn.out   -  person Marc    schedule 12.03.2015
comment
Я все еще вижу buildFilters = [C:\Users\Marc\workspace_mars_2\entourage\filters\prod.properties], Значит активируется прод профиля. Это так редко. Вы используете eclipse с плагином m2e? Иногда этот плагин обновляет файлы при обновлении (я думаю) и использует профиль по умолчанию. В этом случае щелкните правой кнопкой мыши свой проект (тот, который имеет пометку), перейдите в раздел «Свойства» - ›Maven и заполните поле« Активные профили Maven ». Если вы запускаете maven из консоли Windows, то я не знаю, что происходит!   -  person Pablo Lascano    schedule 12.03.2015
comment
Я использую Eclipse с m2e, но все это я делал из командной строки, чтобы избежать путаницы. Вы были сверхчеловечески терпеливы и полезны. На этом этапе можно просто покачать головой, вскинуть руки и смутно обвинить Windows, как это сделал я. Если у вас нет других идей ...   -  person Marc    schedule 12.03.2015
comment
На всякий случай закройте проект в eclipse (или закройте eclipse), запустите команду в cmd ... Скажите, пожалуйста, что вы смотрите файл, сгенерированный в target! : P Я использую maven в окнах и никогда не сталкивался с этой проблемой. Итак, проблема такая же, как и при использовании свойств или фильтров pom ...! И этот файл фильтруется с профилем по умолчанию .. Что произойдет, если вы поместите activeByDefault в профиль продукта?   -  person Pablo Lascano    schedule 12.03.2015
comment
OMG OMG OMG !!!! Каким-то образом ... закрытие Eclipse сработало! Я думаю, что стану суеверным. Это уже слишком. Я до сих пор виню винду как-то. Хорошо. Это было весело, хотя и не обязательно поучительно, так как я до сих пор не понимаю, что вызывает эту проблему. И печально, что я не могу использовать Eclipse для компиляции maven. Ирония в том, что я только что разместил это: quora.com/   -  person Marc    schedule 12.03.2015
comment
Да я серьезно. Нет, я не шучу. См. Здесь: heliosophiclabs.com/~mad/mvn%20insanity.PNG Клянусь Я не придумываю это. Вы были великолепны. Я предлагаю вам опубликовать этот ответ, чтобы я мог принять его, чтобы вы могли хотя бы получить репутацию из всех этих усилий.   -  person Marc    schedule 12.03.2015
comment
Есть ли у вас какие-либо предположения относительно того, что могло быть причиной этого? Я имею в виду, что целевой каталог определенно полностью удаляется и переписывается независимо от того, открыт Eclipse или нет. Удивительно, но он отлично работает, если у меня открыт этот проект в Luna. Марс такой нестабильный? Думаю, это научит меня не использовать последнюю версию чего-либо ...   -  person Marc    schedule 12.03.2015
comment
Вы согласны с тем, что такое поведение исправно ??? bugs.eclipse.org/bugs/show_bug.cgi?id=462027   -  person Marc    schedule 12.03.2015
comment
Моя гипотеза заключается в том, что m2e обновляет цель при обновлении, используя профиль по умолчанию. Есть ли у вас опция «Обновить с помощью собственных перехватчиков» или «опрос», отмеченная в разделе «Общие» - ›Рабочая область?». У меня Eclipse 4.4, постараюсь воспроизвести вашу проблему. И не беспокойтесь о репутации!   -  person Pablo Lascano    schedule 12.03.2015
comment
Я полностью воспроизвел вашу проблему !! Я заметил кое-что еще: открыв Eclipse, запустите его в командной строке mvn clean, теперь перейдите в eclipse ... цель там, с файлами и всем остальным! Разве maven не стерла цель? да, но Eclipse восстанавливает его. Снятие флажков «Обновлять при доступе» и «Обновлять с помощью хуков ...» не решает проблему. Если вы установите в eclipse Active Maven Profiles значение prod и запустите mvn process-resources -P local, вы увидите, что eclipse заменяет его профилем prod. Я не знаю, это ошибка или особенность! : P определенно, я не хочу такой возможности.   -  person Pablo Lascano    schedule 12.03.2015
comment
Снятие флажка «Обновлять с помощью хуков ...» или «Обновлять при доступе» не решает проблему, поскольку в конце вы хотите видеть сгенерированные файлы в своей среде IDE. Если eclipse не обновляется, ваши файлы в порядке, но в тот момент, когда вы обновляете проект в eclipse, они изменяются. Снятие флажка «Сборка автоматически» решает проблему, но вы будете махать рукой, чтобы не забывать выполнять сборку проекта всякий раз, когда вы меняете файл java ... это компромисс ...   -  person Pablo Lascano    schedule 12.03.2015
comment
Согласно Фреду Брикону в вашем отчете об ошибке, это особенность, вы не должны использовать -P с eclipse, вы должны использовать Ctrl+Alt+P для выбора профиля ...: P Приятно знать!   -  person Pablo Lascano    schedule 12.03.2015
comment
Вот это да. вам действительно следует работать в Eclipse Foundation. Это именно то, что они предложили, и это работает. Но ... я ожидал, что использование конфигурации сборки Eclipse maven будет работать с этой опцией или без нее. Это не. Если я установлю для параметра профиля значение prod в Eclipse, я получаю такое же ошибочное поведение, как и в командной строке, когда этот параметр отмечен. ЭТО ВСЕ НЕПРАВИЛЬНО!   -  person Marc    schedule 12.03.2015
comment
Я согласен, с этой функцией вы должны заранее решить, какой профиль вы будете использовать ... Не очень приятно. Может, тебе стоит перейти на Gradle! : P Хотя это не вина maven ...   -  person Pablo Lascano    schedule 13.03.2015
comment
Может быть, вы могли бы ответить сами для справок в будущем (гуглеры). Вы также можете отредактировать свой вопрос, чтобы уточнить, что вы используете Eclipse (проблема была в eclipse, а не в maven). С Уважением!   -  person Pablo Lascano    schedule 13.03.2015


Ответы (1)


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

Отчет об ошибке отправлен в Eclipse Foundation. См. https://bugs.eclipse.org/bugs/show_bug.cgi?id=462027

person Marc    schedule 13.03.2015