android-maven-plugin和资源过滤

4

我是maven的新手,正在尝试使用android-maven-plugin配置它来构建我的Android项目。 在assets目录中有一个application.properties文件,其中包含不同的应用程序设置。我想从我的pom文件中获取这些值。在属性文件中,我定义了一个属性:

myFilteredProperty=${helloFromPOM}

同时在POM中定义相同的属性:

    <properties>
        <helloFromPOM>MY PROPERTY</helloFromPOM>
    </properties>

在资产目录上开启了过滤

<build>
    ...
    <resources>
        <resource>
            <directory>${project.basedir}/assets</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
    ...
</build>

并按照 samples 中的 Android Maven 插件配置资源插件。

        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <executions>
                <execution>
                    <phase>initialize</phase>
                    <goals>
                        <goal>resources</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>

但是,当我尝试在我的应用程序中使用此属性显示Toast时,我看到的是${helloFromPOM}而不是MY PROPERTY。
在由Maven生成的目标目录中,我在两个位置看到了此属性文件:
  • /target/generated-sources/combined-assets/assets/application.properties
  • /target/myapp-0.0.1-SNAPSHOT.apk\application.properties

首先,它是错误的,它包含了 ${helloFromPOM} 而不是 MY PROPERTY。其次,在 apk 文件内部是正确的。但是当我在设备上安装这个 apk 时,它会显示错误的值 ${helloFromPOM}。

我做错了什么?

编辑

谢谢回答,我尝试了,但是出现了这个错误:

[ERROR] 生成源代码时出错。 org.apache.maven.plugin.MojoExecutionException: 在 com.jayway.maven.plugins.android.phase01generatesources.GenerateSourcesMojo.generateR(GenerateSourcesMojo.java:338) 处 在 com.jayway.maven.plugins.android.phase01generatesources.GenerateSourcesMojo.execute(GenerateSourcesMojo.java:102) 处 在 org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101) 处 在 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209) 处 在 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 处 在 org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 处 在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84) 处 在 org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59) 处 在 org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183) 处 在 org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161) 处 在 org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320) 在 org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156) 处 在 org.apache.maven.cli.MavenCli.execute(MavenCli.java:537) 处 在 org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196) 处 在 org.apache.maven.cli.MavenCli.main(MavenCli.java:141) 处 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 处 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 处 在 java.lang.reflect.Method.invoke(Method.java:597) 在 org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290) 处 在 org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230) 处 在 org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409) 处 在 org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352) 处 在 org.codehaus.classworlds.Launcher.main(Launcher.java:47) 在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 处 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 处 在 java.lang.reflect.Method.invoke(Method.java:597) 在 com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) Caused by: com.jayway.maven.plugins.android.ExecutionException: ANDROID-040-001: 无法执行: Command = cmd.exe /X /C ""C:\Program Files\Android\android-sdk\platform-tools\aapt.exe" package -m -J D:\projects\myapp\target\generated-sources\r -M D:\projects\myapp\AndroidManifest.xml -S D:\projects\myapp\target\filtered-assets --auto-add-overlay -A D:\projects\myapp\assets -I "C:\Program Files\Android\android-sdk\platforms\android-8\android.jar"", Result = 1 在 com.jayway.maven.plugins.android.CommandExecutor$Factory$1.executeCommand(CommandExecutor.java:215) 处 在 com.jayway.maven.plugins.android.phase01generatesources.GenerateSourcesMojo.generateR(GenerateSourcesMojo.java:336) 处 ... 28 more [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 4.307s [INFO] Finished at: Wed Jun 06 10:37:14 MSK 2012 [INFO] Final Memory: 7M/16M [INFO] ------------------------------------------------------------------------ [ERROR] 无法执行目标 com.jayway.maven.plugins.android.generation2:android-maven-plugin:3.2.0:generate-sources (default-generate-sources) on project magent: MojoExecutionException: ANDROID-040
当我在POM中注释掉<resourceDirectory>${project.build.directory}/filtered-assets</resourceDirectory>后,构建成功了,但是它没有使用过滤的资源。
我还尝试在命令行中执行这个命令cmd.exe /X /C ""C:\Program Files\Android\android-sdk\platform-tools\aapt.exe" package -m -J D:\projects\myapp\target\generated-sources\r -M D:\projects\myapp\AndroidManifest.xml -S D:\projects\myapp\target\filtered-assets --auto-add-overlay -A D:\projects\myapp\assets -I "C:\Program Files\Android\android-sdk\platforms\android-8\android.jar"",然后得到这个错误:invalid resource directory name: D:\projects\myapp\target\filtered-assets/application.properties。在filtered-assets之后使用了错误的斜杠而不是反斜杠。将<resourceDirectory>${project.build.directory}/filtered-assets</resourceDirectory>更改为<resourceDirectory>${project.build.directory}\filtered-assets</resourceDirectory>也没有帮助。
附:我的插件部分如下。
   <plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <executions>
            <execution>
                <phase>initialize</phase>
                <goals>
                    <goal>resources</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
        </configuration>
    </plugin>
    <plugin>
        <groupId>com.jayway.maven.plugins.android.generation2</groupId>
        <artifactId>android-maven-plugin</artifactId>
        <version>3.2.0</version>
        <configuration>
            <sdk>
                <platform>8</platform>
            </sdk>
            <emulator>
                <avd>2.3.3_API-10</avd>
            </emulator>
            <undeployBeforeDeploy>true</undeployBeforeDeploy>
            <resourceDirectory>${project.build.directory}/filtered-assets</resourceDirectory>
        </configuration>
        <extensions>true</extensions>
    </plugin>

谢谢,我在问题的评论中回答了您的留言。请查看编辑部分。 - Dmitriy Tarasov
3个回答

8

现在它能够正常工作了,我将 <resourceDirectory>${project.build.directory}/filtered-assets</resourceDirectory> 改为 <assetsDirectory>${project.build.directory}/filtered-assets</assetsDirectory>。POM 结果如下:

<properties>
    <myProperty>MY PROPERTY!!!!111</myProperty>
</properties>

    <resources>
        <resource>
            <directory>${project.basedir}/assets</directory>
            <filtering>true</filtering>
            <targetPath>${project.build.directory}/filtered-assets</targetPath>
            <includes>
                <include>**/*.properties</include>
            </includes>
        </resource>
    </resources>

    <plugins>
        <plugin>
            <artifactId>maven-resources-plugin</artifactId>
            <executions>
                <execution>
                    <phase>initialize</phase>
                    <goals>
                        <goal>resources</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.6</source>
                <target>1.6</target>
            </configuration>
        </plugin>
        <plugin>
            <groupId>com.jayway.maven.plugins.android.generation2</groupId>
            <artifactId>android-maven-plugin</artifactId>
            <version>3.2.0</version>
            <configuration>
                <sdk>
                    <platform>8</platform>
                </sdk>
                <emulator>
                    <avd>2.3.3_API-10</avd>
                </emulator>
                <undeployBeforeDeploy>true</undeployBeforeDeploy>
                <assetsDirectory>${project.build.directory}/filtered-assets</assetsDirectory>
            </configuration>
            <extensions>true</extensions>
        </plugin>

0

如果您在pom文件中指定了属性,则不应在单独的文件中声明它。反之,如果您想在单独的文件中指定它,则不应在POM中声明它。

但是,我不确定您要做什么- maven属性仅在构建过程中在pom文件中有效。您无法从应用程序内部访问它们。Android / java不知道它们的存在,也看不到它们,因此您在代码中看到${helloFromPOM}而不是MY PROPERTY的原因是android / java只是显示文本-它不知道它代表一个属性,并且没有办法将其解析为变量或其他值。


我不想直接从我的应用程序中使用 POM 属性。我想使用 Maven 资源过滤器来处理它。http://maven.apache.org/plugins/maven-resources-plugin/examples/filter.html - Dmitriy Tarasov

0
有时候这是由于不适当的平台版本引起的。 尝试在您的pom文件中进行正确设置。 查找类似于

的内容。
<sdk>
    <platform>17</platform>
</sdk>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接