gluon - 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>
如上所示,package、versionCode、versionName和appLabel被定义为过滤器变量。
下面是执行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>
因此,对于android、ios和每所学校都有配置文件。我使用以下 maven 命令分别构建和打包“ mvn client:build -P school1,android ”、“ mvn client:package -P school1,android ”。
解决方案
推荐阅读
- java - Eclipse - 将 -noverifycannot 添加到 jvm 参数
- heroku - 我的 Heroku 应用程序的剩余速率限制令牌
- python - 基于另一个较短列表的列表排序
- jquery - Bootstrap 4 - 删除导航链接上的活动类
- git - 如何在两者都在积极开发的同时将类文件从一个存储库移动到另一个存储库
- tcp - 重写所有传出流量的源地址
- node.js - 节点 6:hiredis 的 node-gyp 重建在 macOS 上失败
- java - Spring Boot OAuth2 授权代码流中的 InsufficientAuthenticationException
- c# - 实体框架:使用通用存储库从多个实体中检索数据
- android - 使用firestore,是否可以配置离线持久性以在特定文档中设置“关闭”?