7

Maven으로 제작 된 Android 애플리케이션이 있습니다. buildnumber-maven-plugin과 maven-resources-plugin을 사용하여 AndroidManifest에 maven 프로젝트 버전과 git commit 해시를 삽입합니다. buildnumber-maven-plugin의 create 목표는 validate 단계에서 실행되며, maven-resources-plugin의 resources 목표는 initialize 단계에서 실행됩니다.Android Studio/IntelliJ 사용시 pom이 올바르게 실행되지 않는 이유는 무엇입니까?

명령 줄 (mvn install)을 통해 빌드 할 때 모든 것이 올바르게 작동하고 빌드 번호가 생성 된 매니페스트에 올바르게 나타납니다.

그러나 Android Studio 또는 IntelliJ를 통해 빌드 할 때 매니페스트에는 git commit 해시가 존재하지 않지만 (Maven 속성은 실제 값으로 대체되지 않음) maven 프로젝트 버전은 존재합니다.

왜?



는 참고 : 안드로이드 Studio는 만들기 전에 메이븐 위상 프로세스 자원을 실행, 그래서 작동합니다.

Maven 3.0.3을 사용 중이므로 IntelliJ가 사용하는 버전을 찾을 수는 없지만 버전 문제 일 수 있습니다. 여기

내 POM의 빌드 요소 :

<build> 
    <sourceDirectory>src</sourceDirectory> 
    <testSourceDirectory>test</testSourceDirectory> 

    <resources> 
     <resource> 
      <directory>${project.basedir}</directory> 
      <filtering>true</filtering> 
      <targetPath>${project.build.directory}/filtered-manifest</targetPath> 
      <includes> 
       <include>AndroidManifest.xml</include> 
      </includes> 
     </resource> 
    </resources> 

    <plugins> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>buildnumber-maven-plugin</artifactId> 
      <version>${maven.buildnumber.version}</version> 
      <configuration> 
       <doCheck>false</doCheck> 
       <doUpdate>false</doUpdate> 
       <shortRevisionLength>6</shortRevisionLength> 
       <revisionOnScmFailure>000000</revisionOnScmFailure> 
      </configuration> 
      <executions> 
       <execution> 
        <phase>validate</phase> 
        <goals> 
         <goal>create</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <artifactId>maven-resources-plugin</artifactId> 
      <version>${maven.resources.version}</version> 
      <executions> 
       <execution> 
        <phase>initialize</phase> 
        <goals> 
         <goal>resources</goal> 
        </goals> 
       </execution> 
      </executions> 
     </plugin> 

     <plugin> 
      <groupId>com.jayway.maven.plugins.android.generation2</groupId> 
      <artifactId>android-maven-plugin</artifactId> 
      <extensions>true</extensions> 
      <configuration> 
       <androidManifestFile>${project.build.directory}/filtered-manifest/AndroidManifest.xml</androidManifestFile> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 

그리고 내 AndroidManifest를 파일에 versionName을 수 있습니다 : 가득 커맨드 $ {project.version} 모두와 $ {buildNumber}에서

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.somecompany" 
    android:versionCode="1" 
    android:versionName="${project.version}-${buildNumber}" > 

IntelliJ $ {buildNumber}의 값이 올바르게 표시되지 않고 "$ {buildNumber}"로 표시됩니다. 이는 (revisionOnScmFailure을 설정했기 때문에) 플러그인이 전혀 실행되지 않는다는 것을 나타냅니다.

목표를 initialize 단계 (IntelliJ가 validate을 건너 뛰었을 때를 대비하여)로 변경하려고 시도했지만 아무런 차이가 없습니다.

+0

이 문제와 관련하여 어떤 진전이 있었습니까? –

+0

슬프게도 나는 아직 안왔다. 해결 방법으로 "make"가 아닌 IntelliJ에서 maven "install"작업을 사용할 수 있습니다. –

답변

7

IntelliJ는 다른 IDE와 매우 비슷한 내부 빌드 시스템을 갖추고 있으며 외부 도구없이 프로젝트를 빌드 할 수 있습니다. 또한 Intellij는 프로젝트의 pom.xml을 해석하고 정의한 구성을 기반으로 빌드하도록 Maven과 통합합니다. 이것은 대부분의 컴파일 작업에서 잘 작동하지만 buildnumber-maven-plugin과 같은 더 복잡한 플러그인을 가져올 때 넘어지기 시작합니다. 불행히도 IntelliJ는이 플러그인을 처리 할 내부 표현을 가지고 있지 않으므로 $ {buildNumber} 속성은 절대로 채워지지 않습니다.

가능한 해결 방법은 다음과 같습니다

  1. 에 "보기"> "도구 윈도우를"가서 당신이 보여줄 수있는 "메이븐 프로젝트"패널을 사용하여, 인 IntelliJ의 시스템에 내장 된 프로젝트를 빌드하지 마십시오 > "Maven 프로젝트". 이렇게하면 모든 표준 Maven 단계 및 기타 기능에 액세스 할 수 있습니다.

  2. "실행 구성"에서 "buildNumber"라는 환경 변수를 추가하고 원하는 값을 지정하십시오 (예 : buildNumber = DEV). 이렇게하면 빌드 프로세스 중에 buildNumber 속성을 사용할 수있게되고 속성을 채울 수 있지만 SCM에서는 업데이트되지 않습니다.

우리는 buildnumber-maven-plugin과 비슷한 한계를 맞았으므로 다중 모듈 maven 프로젝트의 첫 번째 해결 방법을 사용합니다. IntelliJ에서 통합 테스트를 실행해야 할 때 솔루션 2를 사용합니다. 우리가 코드를 통해 버전 정보를 표시하려면 buildNumber 속성이 필요합니다.

이 방법이 다소 유용 할 것입니다. IntelliJ의 내부 빌드 시스템이 buildnumber-maven-plugin에 대해 어느 정도 이해하고 빌드 프로세스 중에 환경에 올바른 속성을 표시하는 유일한 해결책이 될 수 있기를 바랍니다.

+0

그러나 POM을 가져 오지는 않습니다 ** 또한 Maven 단계 프로세스 자원을 실행해야합니다. buildnumber 플러그인이 실행 중입니다. 답변 주셔서 감사합니다. 내가 생각한 한 우리의 경우 1. 빌드 시간이 늘어날 때 개발자가 거의 없을 것이기 때문에 받아 들일 수는 없지만 2. 아마 그렇게 할 것입니다. 다른 답변을 위해 약간의 시간을 허용하기 위해 이것을 정확하게 표시하지 않을 것입니다. –

+0

IntelliJ의 컴파일러가 과거에 pom.xml을 해석 할 때 실제로 무엇을했는지 알아내는 것이 어렵다는 것을 알았습니다. 거기에는 정보가 많이없는 것 같습니다. 내 이해는 IntelliJ가 "프로세스 리소스"단계 (또는 그 단계에서는 모든 단계) 동안 maven을 포함하지 않지만 pom.xml을 읽음으로써 구성되는 "프로세스 리소스"를 자체적으로 구현한다는 것입니다. –

관련 문제