7

Tôi có một ứng dụng Android được xây dựng với Maven. Sử dụng plugin buildnumber-maven-plugin và maven-resources-plugin Tôi chèn phiên bản dự án maven và git commit hash vào AndroidManifest. Mục tiêu create của plugin buildnumber-maven chạy trong giai đoạn validate và mục tiêu resources của plugin maven-resources chạy trong giai đoạn initialize.Tại sao pom của tôi không được thực hiện đúng khi sử dụng Android Studio/IntelliJ?

Khi được xây dựng thông qua dòng lệnh (với mvn install) tất cả đều hoạt động tốt và số bản dựng xuất hiện chính xác trong tệp kê khai được tạo.

Tuy nhiên khi xây dựng thông qua Android Studio hoặc IntelliJ git commit hash không có mặt (thuộc tính Maven không được thay thế bằng giá trị thực) trong tệp kê khai nhưng phiên bản dự án maven là.

Tại sao?



FYI: Android Studio chạy Maven giai đoạn quá trình nguồn trước khi thực hiện, vì vậy nó phải làm việc.

Trên dòng lệnh tôi đang sử dụng Maven 3.0.3, do đó, nó có thể là một vấn đề phiên bản (mặc dù tôi không thể tìm ra phiên bản IntelliJ sử dụng).

Đây là POM tôi xây dựng phần tử:

<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> 

Và phiên bản trong tập tin AndroidManifest của tôi là:

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

Từ commandline cả $ {project.version} và $ {} buildNumber được điền một cách chính xác với giá trị của chúng, từ IntelliJ $ {buildNumber} không và chỉ xuất hiện dưới dạng "$ {buildNumber}": điều này sẽ cho biết (vì tôi đã đặt revisionOnScmFailure) rằng plugin không chạy được.

Tôi đã thử thay đổi mục tiêu create để chạy trong giai đoạn initialize (trong trường hợp IntelliJ bị bỏ qua validate) nhưng điều đó không có sự khác biệt.

+0

Có bất kỳ tiến triển nào với vấn đề này không? –

+0

Đáng buồn là tôi chưa có; như workaround bạn có thể sử dụng nhiệm vụ "install" maven từ IntelliJ chứ không phải là "make" –

Trả lời

7

IntelliJ có hệ thống xây dựng nội bộ riêng của nó giống như bất kỳ IDE nào khác và có thể xây dựng các dự án mà không cần sự trợ giúp của các công cụ bên ngoài. Intellij cũng tích hợp với Maven bằng cách diễn giải pom.xml từ dự án của bạn và cấu trúc nó để xây dựng dựa trên cấu hình bạn đã định nghĩa. Điều này hoạt động khá tốt với hầu hết các tác vụ biên dịch nhưng lại bắt đầu giảm khi bạn mang các plugin phức tạp hơn như plugin buildnumber-maven. Thật không may IntelliJ không có sự tương đối nội bộ để xử lý plugin này nên thuộc tính $ {buildNumber} không bao giờ được điền.

Các cách giải quyết có thể là:

  1. Không xây dựng dự án của bạn với xây dựng trong hệ thống của IntelliJ, sử dụng "Maven Dự án" bảng điều khiển mà bạn có thể hiển thị bằng cách vào "View"> "Công cụ Windows" > "Dự án Maven". Điều này cho phép bạn truy cập vào tất cả các giai đoạn Maven tiêu chuẩn và các tính năng khác.

  2. Trong cấu hình chạy IntelliJ của bạn, hãy thêm biến môi trường có tên là "buildNumber" và cung cấp cho nó bất kỳ giá trị nào bạn thích, ví dụ: buildNumber = DEV. Điều này sẽ làm cho thuộc tính buildNumber có sẵn trong quá trình xây dựng và điền thuộc tính, tuy nhiên nó sẽ không cập nhật từ SCM của bạn.

Chúng tôi sử dụng giải pháp thay thế đầu tiên cho dự án maven nhiều mô-đun vì chúng tôi cũng đã đạt các giới hạn tương tự với plugin xây dựng-maven. Chúng tôi cũng sử dụng giải pháp 2 khi chúng tôi cần chạy thử nghiệm tích hợp trong IntelliJ vì thuộc tính buildNumber được mã của chúng tôi yêu cầu hiển thị thông tin phiên bản, miễn là chúng tôi cung cấp cho nó bất kỳ giá trị nào mà nó hài lòng.

Tôi hy vọng điều này có phần hữu ích đối với bạn, giải pháp thực sự duy nhất cho hệ thống xây dựng bên trong của IntelliJ để hiểu về plugin xây dựng và hiển thị các thuộc tính chính xác cho môi trường trong quá trình xây dựng.

+0

Nhưng nó không ** chỉ ** nhập POM, nó cũng * giả định * để chạy Maven phase process-resources, mà kết quả trong plugin buildnumber đang được chạy. Cảm ơn câu trả lời. Theo như tôi đang quan tâm trong trường hợp của chúng tôi 1. là không thể chấp nhận được vì vài devs sẽ đưa lên với sự gia tăng thời gian xây dựng, nhưng 2. có lẽ sẽ làm. Tôi sẽ đánh dấu điều này là chính xác để dành thời gian cho bất kỳ câu trả lời nào khác. –

+0

Tôi thấy khó tìm ra trình biên dịch IntelliJ thực sự đang làm gì khi nó diễn giải pom.xml trong quá khứ, dường như không có nhiều thông tin ngoài kia. Sự hiểu biết của tôi là IntelliJ không liên quan đến maven trong giai đoạn "tài nguyên quy trình" (hoặc bất kỳ giai đoạn nào cho vấn đề đó) nhưng có thực hiện riêng "tài nguyên quy trình" được định cấu hình bằng cách đọc tệp pom.xml –

Các vấn đề liên quan