首页 > 解决方案 > Gluon 客户端 Maven 插件 - 资源过滤不适用于“客户端:包”

问题描述

我正在开发一个 javafx 11 移动项目,并且正在使用 Gluon 客户端插件来构建 APK。

从这个单一项目中,我们需要为不同的客户构建多个应用程序 (APK)。我已经使用 Maven 配置文件完成了这项工作。

现在我正在尝试动态更新“AndroidManifest.xml”以为每个构建设置不同的包名称。我已经尝试过 Maven 资源过滤来动态更新该属性。它没有按预期工作。

下面是“AndroidManifest.xml”(在 src/android 中):

<?xml version='1.0'?>
<manifest xmlns:android='http://schemas.android.com/apk/res/android'
    package='${app.package.name}'
    android:versionCode='${app.version.code}'
    android:versionName='${app.version.name}'>
    <supports-screens android:xlargeScreens="true"/>
    <uses-permission android:name="android.permission.INTERNET"/>

<application android:label="${app.name}" android:icon="@mipmap/ic_launcher">
    <activity android:name='com.gluonhq.helloandroid.MainActivity' android:configChanges="orientation|keyboardHidden">
         <intent-filter>
            <category android:name='android.intent.category.LAUNCHER'/>
            <action android:name='android.intent.action.MAIN'/>
         </intent-filter>
    </activity>
    <activity android:name='com.gluonhq.helloandroid.PermissionRequestActivity'/>
</application>

如上所示,packageversionCodeversionNameappLabel被定义为过滤器变量。

下面是执行mvn client:build -P android命令后“target\classes”中的清单。

<?xml version='1.0'?>
<manifest xmlns:android='http://schemas.android.com/apk/res/android'
    package='com.company.parent.app'
    android:versionCode='1'
    android:versionName='1.0'>
    <supports-screens android:xlargeScreens="true"/>
    <uses-permission android:name="android.permission.INTERNET"/>

<application android:label="CB Parents" android:icon="@mipmap/ic_launcher">
    <activity android:name='com.gluonhq.helloandroid.MainActivity' android:configChanges="orientation|keyboardHidden">
         <intent-filter>
            <category android:name='android.intent.category.LAUNCHER'/>
            <action android:name='android.intent.action.MAIN'/>
         </intent-filter>
    </activity>
    <activity android:name='com.gluonhq.helloandroid.PermissionRequestActivity'/>
</application>

下面是执行mvn client:package -P android命令后“target\client\aarch64-android\gvm\android_project\app\src\main”中的清单。

<?xml version='1.0'?>
<manifest xmlns:android='http://schemas.android.com/apk/res/android'
    package='${app.package.name}'
    android:versionCode='${app.version.code}'
    android:versionName='${app.version.name}'>
    <supports-screens android:xlargeScreens="true"/>
    <uses-permission android:name="android.permission.INTERNET"/>

<application android:label="${app.name}" android:icon="@mipmap/ic_launcher">
    <activity android:name='com.gluonhq.helloandroid.MainActivity' android:configChanges="orientation|keyboardHidden">
         <intent-filter>
            <category android:name='android.intent.category.LAUNCHER'/>
            <action android:name='android.intent.action.MAIN'/>
         </intent-filter>
    </activity>
    <activity android:name='com.gluonhq.helloandroid.PermissionRequestActivity'/>
</application>

由于未按预期应用过滤器,因此“mvn client:package -P android”任务失败。

下面是我如何在pom.xml中为 AndroidManifest 应用过滤。

<!-- To set AndroidManifest properties dynamically -->
  <resource>
    <directory>src/android</directory>
    <!-- Map ${} into resources -->
    <filtering>true</filtering>
    <includes>
      <include>AndroidManifest.xml</include>
    </includes>
  </resource>

为什么过滤不能仅与 'mvn client:package' 任务一起使用,而它与 'mvn client:build' 任务一起使用?还是我错过了什么?

PS。也可以通过客户端插件配置更新“appLabel”、“versionCode”和“versionName”。但我想将每个动态属性保存在一个属性文件中。而且也没有通过该插件设置“packageName”的选项。这就是我通过资源过滤更新它们的原因。

更新 #1:这是我的 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>multi-profile-project3</groupId>
  <artifactId>multi-profile-project3</artifactId>
  <version>0.0.1-SNAPSHOT</version>

    <properties>
        <main.class>com.multiprofile.app.main.Main</main.class>
    </properties>

  <build>
  
    <!-- Loading all ${} -->
    <filters>
      <filter>src/${env}/resources/application-${env}.properties</filter>
    </filters>
    
    <resources>
      <!-- Loading fxml and css (under 'main' directory) -->
      <resource>
        <directory>src/main/java</directory>
        <excludes>
          <exclude>**/*.java</exclude>
        </excludes>
      </resource>

      <!-- Loading main resources -->
      <resource>
        <directory>src/main/resources</directory>
        <!-- Map ${} into resources -->
        <filtering>true</filtering>
        <includes>
          <include>*.properties</include>
        </includes>
      </resource>

      <!-- Loading school specific resources based on 'env' -->
      <resource>
        <directory>src/${env}/resources</directory>
        <excludes>
          <exclude>*.properties</exclude>
        </excludes>
      </resource>

      <!-- To set AndroidManifest properties dynamically -->
      <resource>
        <directory>src/android</directory>
        <!-- Map ${} into resources -->
        <filtering>true</filtering>
        <includes>
          <include>AndroidManifest.xml</include>
        </includes>
      </resource>
    </resources>

    <plugins>

      <plugin>
        <groupId>org.openjfx</groupId>
        <artifactId>javafx-maven-plugin</artifactId>
        <version>0.0.1</version>
        <configuration>
            <mainClass>${main.class}</mainClass>
        </configuration>
      </plugin>

<!-- Copy images from src/{env}/resources/images/android_res
                 to src/android/res -->
      <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-resources-plugin</artifactId>
         <version>2.4</version>
         <executions>
           <execution>
            <id>id.initresources</id>
            <phase>validate</phase>
            <goals>
              <goal>resources</goal>
            </goals>
          </execution>

           <execution>
             <id>copy-resources</id>
             <phase>validate</phase>
             <goals>
               <goal>copy-resources</goal>
             </goals>
             <configuration>
               <outputDirectory>src/android/res</outputDirectory>
               <resources>          
                <resource>
                  <directory>src/${env}/resources/images/android_res</directory>
                  <filtering>true</filtering>
                </resource>
              </resources>
             </configuration>
           </execution>
         </executions>       
      </plugin>
    
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>3.2.0</version>
        <executions>
            <execution>
                <phase>package</phase>
                <goals>
                    <goal>shade</goal>
                </goals>
                <configuration>
                    <transformers>
                        <transformer
                                implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>${main.class}</mainClass>
                        </transformer>
                    </transformers>
                </configuration>
            </execution>
        </executions>
      </plugin>

      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.8.1</version>
        <configuration>
          <source>11</source>
          <target>11</target>
        </configuration>
      </plugin>

        <!-- To load properties from '.properties' file and use them as a property -->
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>properties-maven-plugin</artifactId>
            <version>1.0.0</version>
            <executions>
              <execution>
                <id>id.validateprops</id>
                <phase>validate</phase>
                <goals>
                  <goal>read-project-properties</goal>
                </goals>
                <configuration>
                  <files>
                    <file>src/${env}/resources/application-${env}.properties</file>
                  </files>
                </configuration>
              </execution>
              
              <execution>
                  <id>id.outputprops</id>
                  <phase>generate-resources</phase> 
                  <goals> 
                      <goal>write-project-properties</goal> 
                  </goals> 
                  <configuration> 
                      <outputFile>${project.build.outputDirectory}/properties-from-pom.properties</outputFile> 
                  </configuration> 
              </execution>            
            </executions>
          </plugin>

      <plugin>
        <groupId>com.gluonhq</groupId>
        <artifactId>client-maven-plugin</artifactId>
        <version>0.1.36</version>
        <configuration>
            <target>${client.target}</target>
            <mainClass>${main.class}</mainClass>
            <reflectionList>
              <list>com.multiprofile.app.login.LoginPresenter</list>
            </reflectionList>
            <bundlesList>
              <list>application</list>
            </bundlesList>
            <releaseConfiguration>
            </releaseConfiguration>
        </configuration>
        </plugin>
    </plugins>
  </build>

  <profiles>
    
    <profile>
      <id>school1</id>
      <properties>
        <env>school1</env>
      </properties>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
    </profile>
    
    <profile>
      <id>school2</id>
      <properties>
        <env>school2</env>
      </properties>
    </profile>
    
    <profile>
      <id>school3</id>
      <properties>
        <env>school3</env>
      </properties>
    </profile>

    <!-- Profile for android build -->
    <profile>
      <id>android</id>
      <properties>
        <client.target>android</client.target>
      </properties>
    </profile>

    <!-- Profile for ios build -->
    <profile>
      <id>ios</id>
      <properties>
        <client.target>ios</client.target>
      </properties>
    </profile>
  </profiles>

  <dependencies>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-controls</artifactId>
      <version>11.0.2</version>
    </dependency>
    <dependency>
      <groupId>org.openjfx</groupId>
      <artifactId>javafx-fxml</artifactId>
      <version>11.0.2</version>
    </dependency>
    <dependency>
      <groupId>com.airhacks</groupId>
      <artifactId>afterburner.fx</artifactId>
      <version>1.7.0</version>
    </dependency>
    <dependency>
      <groupId>javax.annotation</groupId>
      <artifactId>javax.annotation-api</artifactId>
      <version>1.3.2</version>
    </dependency>
  </dependencies>
</project>

因此,对于androidios每所学校都有配置文件。我使用以下 maven 命令分别构建和打包“ mvn client:build -P school1,android ”、“ mvn client:package -P school1,android ”。

标签: gluongluon-mobilejavafx-11

解决方案


推荐阅读