다른 프로필이 활성화 된 경우에도 activeByDefault 인 Maven 프로필을 활성 상태로 유지하는 방법은 무엇입니까?


113

내 pom.xml에 명시 적으로 비활성화되지 않는 한 항상 활성화되어야하는 프로필이 있습니다 (-P! firstProfile). activeByDefault 플래그를 사용하여이 문제를 해결했습니다.

<profiles>
  <profile>
    <id>firstProfile</id>
    <activation>
      <activeByDefault>true</activeByDefault>
    </activation>
    ...
  </profile>
</profiles>

이제 동일한 pom.xml에 두 번째 프로필이 정의되어 있습니다. 프로필이 실제로 활성화 된 경우에만 활성화되어야합니다 (-P secondProfile). 따라서 기본 동작은 firstProfile active, secondProfile inactive입니다. 다른 지점에서 첫 번째 프로필 외에도 두 번째 프로필을 활성화하고 싶습니다. 이제 문제는 "-P secondProfile"을 사용하여 수행하면 불행히도 firstProfile이 비활성화된다는 것입니다. Maven 문서는 다음과 같이 설명합니다.

... 이전에 설명한 방법 중 하나를 사용하여 동일한 POM의 다른 프로필을 활성화하지 않는 한이 프로필은 모든 빌드에 대해 자동으로 활성화됩니다. 기본적으로 활성화 된 모든 프로필은 POM의 프로필이 명령 줄에서 활성화되거나 활성화 구성을 통해 활성화 될 때 자동으로 비활성화됩니다. ...

어떻게 든 firstProfile을 항상 활성 상태로 유지하는 방법이 있습니까 (settings.xml에서 선언 할 필요없이)?


답변:


153

한 가지 트릭은를 피하고 activeByDefault대신 속성이없는 경우 프로필을 활성화하는 것입니다. 예 :

<profiles>
  <profile>
    <id>firstProfile</id>
    <activation>
      <property>
        <name>!skipFirstProfile</name>
      </property>
    </activation>
    ...
  </profile>
</profiles>

그런 다음 -DskipFirstProfile 또는로 프로필을 비활성화 할 수 있어야합니다. -P !firstProfile그렇지 않으면 프로필이 활성화됩니다.

참조 : Maven : The Complete Reference, Profile Activation-Activation by the Absence of a Property


어떤 상황에서 프로필 자체를 명시 적으로 언급하는 것보다 도움이되거나 더 낫습니까? 즉 -DmyFlag를 전달하는 대신 -PmyDefaultProfile을 올바르게 할 수 있습니까? 내가 놓친 플래그로 제어하는 ​​것이 어떤 이점이 있습니까?
Chetya 2015-06-27

1
플래그가 없을 때 프로필이 자동으로 활성화되기 때문입니다. 프로필 firstProfile은 지정한 경우에만 비활성화됩니다 -DskipFirstProfile(예 :) mvn verify -DskipFirstProfile.
seanf

25

나는 그런 가능성이 있었으면 좋겠다. 나는 종종 그것을 놓쳤다. 내가 찾을 수있는 유일한 관련 JIRA 문제는 다음과 같습니다.

MNG-4917 : activeByDefault가 true로 설정되어 있어도 프로필이 활성화되지 않음

그리고 그것은 Not A Problem.

activeByDefault이 "전부 또는 전무"접근 방식이 나에게 쓸모 없게 만들었 기 때문에 사용을 중단 했습니다.


이 동작을 변경하는 유일한 방법은에 대한 대체를 작성 DefaultProfileSelector하고을 사용하여 plexus 구성 요소로 등록한 다음 @Component( role = ProfileSelector.class )넣는 것입니다 ${MAVEN_HOME}/lib/ext(그러면 기본 프로필 선택기로 선택됨). (Maven 3.0.2 또는 이전 버전을 사용하는 경우 ${MAVEN_HOME}/bin/m2.conf로드 lib/ext하기 전에 로드 하도록 편집 해야합니다. lib)


또 다른 좋은 방법은 프로필 상속 또는 프로필 데코레이터로 기본 구성을 다시 사용할 수 있습니다.
crowne 2011 년

@crowne 확실히 그렇습니다. 기능 요청으로 제안하지 않으시겠습니까?
Sean Patrick Floyd

이것은 일종의 관련이 있습니다. 실행에서 모듈을 제거 할 방법이 없다고 생각했기 때문에 기본 프로필에 모든 모듈을 추가하는 것을 좋아합니다. 3.2.1에서는 여기에 표시된대로이를 추가했습니다 . 누군가 여기에서 우연히 발견되어 저와 비슷한 이유로 모듈을 사용하는 경우를 대비하여이 의견을 남기겠습니다.
Captain Man

10

이 질문은 고대이지만, 문제는 사용하여 풀 수있다 나타납니다 activeProfile보다는 activeByDefault. 나는 Maven 3.3.9를 사용하고 있지만 솔루션은 이전 버전에서 작동 할 수 있습니다.

activeProfiles다음 settings.xml과 같이 에서 간단히 나열하십시오 .

<settings>
  <profiles>
    [...]
  </profiles>
  <activeProfiles>
    <activeProfile>my-awesome-profile</activeProfile>
  </activeProfiles>
</settings>

에는 my-awesome-profile데이터베이스 URL 등과 같은 설정이 있으므로 항상 적용됩니다. 여기에서 두 번째 프로필을 활성화합니다 resolve-from-central.

$ mvn help:all-profiles -P resolve-from-central 
[INFO] Scanning for projects...
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building Maven Stub Project (No POM) 1
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-help-plugin:2.2:all-profiles (default-cli) @ standalone-pom ---
[INFO] Listing Profiles for Project: org.apache.maven:standalone-pom:pom:1
  Profile Id: resolve-from-central (Active: true , Source: settings.xml)
  Profile Id: my-awesome-profile (Active: true , Source: settings.xml)
  Profile Id: resolve-from-internal (Active: false , Source: settings.xml)

공지 사항에서는 my-awesome-profile여전히 활성 상태입니다. 예이!


4

다음과 같이 명령 줄에서 활성화하려는 모든 프로필을 간단히 나열 할 수 있습니다.

-P 프로필 -1, 프로필 -2

maven은 다중 프로필 활성화를 자동으로 허용하도록 설계되었지만 -P로 재정의하면 매개 변수에 나열된 프로필 만 활성화됩니다.


7
그것은 전적으로 사실이 아닙니다. 프로필 -P만 비활성화 하여 수동으로 프로필을 활성화 <activeByDefault>합니다. <activeProfiles>in settings.xml또는 다른 유형에 의해 활성화 된 프로필 <activation>은 명시 적으로 비활성화되지 않는 한 활성 상태로 유지됩니다.
Sam Hanes 2013 년

4

프로필은 POM에 순서를 가져 오는 좋은 방법입니다. 특히 다른 목적으로 동일한 플러그인을 여러 번 실행하는 경우.

파일 사용 :

<profile>
    <id>alwaysActive</id>
    <activation>
         <file><exists>.</exists></file>
    </activation>
    ...
</profile>

이것은 항상 사실입니다 (Maven 부팅 중에 누군가가 디렉토리를 삭제하지 않는 한). Maven 3.6.0으로 테스트되었습니다.

프로젝트 유형을 구별하는 좋은 방법 일 수도 있습니다. 예를 들어, 내 프로젝트는 항상 module.json존재합니다.

프로필 활성화 확장 사용

프로필 활성화를위한 몇 가지 Maven 확장이 있습니다. 그중 하나는 여기 포크에 있습니다 :
https://github.com/OndraZizka/el-profile-activator-extension


1
작은 수정은 것 같습니다<file><exists>.</exists></file>
revau.lt

-1

기본 프로필을 활성 상태로 유지할 수는 없지만 해당 프로필의 내용 (예 : ...)을 가져 와서 pom의 기본 섹션으로 이동할 수 있습니다.

프로필을 사용하고 있다고해서 수행하는 모든 작업이 프로필 내에 있어야한다는 의미는 아닙니다.


이것은 질문에 대한 답이 아닙니다. OP는 프로필이 "명시 적으로 비활성화되지 않는 한 항상 활성화"되어야한다고 명시합니다. 아마도 때로는 명시 적으로 비활성화해야 할 필요가 있으며이 답변은 허용하지 않습니다.
sleske
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.