【问题标题】:android-maven-plugin and resource filteringandroid-maven-plugin 和资源过滤
【发布时间】:2012-06-09 15:08:15
【问题描述】:

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

myFilteredProperty=${helloFromPOM}

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

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

开启对资产目录的过滤

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

并配置资源插件,如samples for android-maven-plugin

        <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) 引起:com.jayway.maven.plugins.android.ExecutionException: ANDROID-040-001:无法执行:命令 = cmd.exe /X /C ""C:\Program Files\Android\android-sdk\platform-tools\aapt.exe" 包 -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 文件\Android\android-sdk\platforms\android-8\android.jar"",结果 = 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 更多 [信息] -------------------------------------------------- ---------------------- [信息] 构建失败 [信息] -------------------------------------------------- ---------------------- [INFO] 总时间: 4.307s [INFO] 完成时间: Wed Jun 06 10:37:14 MSK 2012 [INFO] 最终内存:7M/16M [INFO] -------------------------------------------------- ---------------------- [错误] 未能执行目标 com.jayway.maven.plugins.android.generation2:android-maven-plugin:3.2.0:generate-sources 项目 magent 上的 (default-generate-sources):MojoExecutionException: ANDROID-040-001:无法执行:命令 = cmd.exe /X /C ""C:\Program Files\Android\android-sdk\platform-tools\aapt.exe" 包 -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 文件\Android\android-sdk\platforms\android-8\android.jar"",结果 = 1 -> [Help 1] [ERROR] [ERROR] 查看完整的堆栈跟踪 错误,使用 -e 开关重新运行 Maven。 [错误] 使用重新运行 Maven -X 开关以启用完整的调试日志记录。 [错误] [错误] 更多 有关错误和可能的解决方案的信息,请阅读 以下文章:[错误] [帮助 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException

当我在 POM 中评论 &lt;resourceDirectory&gt;${project.build.directory}/filtered-assets&lt;/resourceDirectory&gt; 时,构建完成成功,但它不使用过滤的资产。

我还尝试在命令行中执行此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。过滤后的资产后使用错误的斜线而不是反斜线。将&lt;resourceDirectory&gt;${project.build.directory}/filtered-assets&lt;/resourceDirectory&gt; 更改为&lt;resourceDirectory&gt;${project.build.directory}\filtered-assets&lt;/resourceDirectory&gt; 也无济于事。

附:我的插件部分看起来像这样

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

【问题讨论】:

  • 谢谢,我回答了您的评论。见编辑部分

标签: android maven android-maven-plugin maven-resources-plugin


【解决方案1】:

有时是由不合适的平台版本引起的。 尝试在您的 pom 文件中正确设置它。 寻找类似的东西

<sdk>
    <platform>17</platform>
</sdk>

【讨论】:

    【解决方案2】:

    现在可以了,我将 &lt;resourceDirectory&gt;${project.build.directory}/filtered-assets&lt;/resourceDirectory&gt; 更改为 &lt;assetsDirectory&gt;${project.build.directory}/filtered-assets&lt;/assetsDirectory&gt;。结果 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>
    

    【讨论】:

      【解决方案3】:

      如果您在 pom 中指定属性,您也不应该在单独的文件中声明它。相反,如果你想在一个单独的文件中指定它,你不应该在你的 POM 中声明它。

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

      【讨论】:

      猜你喜欢
      • 2013-04-11
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      • 1970-01-01
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多