执行proguard-maven-plugin时,出现“CreateProcess error=206, The filename or extension is too long”

Posted

技术标签:

【中文标题】执行proguard-maven-plugin时,出现“CreateProcess error=206, The filename or extension is too long”【英文标题】:When executing proguard-maven-plugin, "CreateProcess error=206, The filename or extension is too long" occurs 【发布时间】:2015-06-28 07:28:00 【问题描述】:

我们正在开发我们自己的 Eclipse 插件 jar,供我们基于 Eclipse 的应用程序使用。我们目前使用proguard-maven-plugin 2.0.8 版来混淆它们。但是,在某些插件上运行mvn install 时,我们目前遇到以下错误:

[INFO] ---------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ---------------------------------------------------------------------
[INFO] Total time: 1:34.297s
[INFO] Finished at: Tue Apr 21 16:03:51 SGT 2015
[INFO] Final Memory: 88M/210M
[INFO] ---------------------------------------------------------------------
[ERROR] Failed to execute goal com.github.wvengen:proguard-maven-plugin:2.0.8:proguard (default) on project com.x.y: Execution default of goal com.github.wvengen:proguard-maven-plugin:2.0.8:proguard failed: java.io.IOException: Cannot run program "C:\Program Files (x86)\Java\jdk1.7.0_55\jre\bin\java.exe": CreateProcess error=206, The filename or extension is too long -> [Help 1]

有人遇到过这种情况吗?如果有,您是如何解决问题的?

请注意,在决定询问之前,我实际上已经看到了this question 和其他相关问题,但 Brad Mace 的答案不适用于我的情况,因为生成了“CreateProcess error=206, The filename or extension is too long”由 Proguard 而不是 Javadoc。最初,我认为(如果我错了,请纠正我)espinchi 给出的 7 个选项中的一个或它们的变体可能会起作用,但我不确定是哪一个。只是为了让您知道我在确定解决方案时的限制:

    我不确定这个特定插件中的所有类路径是否都是 有效,因为这已经由其他人开发了很多很多年 以前,所以我认为我仍然无法联系开发人员。这使得 我犹豫要减少类路径,因为担心它实际上可能 弊大于利。 我无法使用切换到“使用 IntelliJ”选项,因为在执行 mvn install 时在 Windows 命令行上出现此问题 而不是在 Eclipse IDE 中。 我认为其他选项对我来说太乏味了。我希望有一个更简单的解决方案。

作为参考,下面是我的 pom 文件中与 Proguard 相关的 sn-p:

<build>
    <plugins>
        <plugin>
            <groupId>com.github.wvengen</groupId>
            <artifactId>proguard-maven-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>proguard</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <maxMemory>1024m</maxMemory>
                <proguardInclude>$basedir/proguard.conf</proguardInclude>
                <libs>
                    <lib>$java.home/lib/rt.jar</lib>
                </libs>
                <exclusions>
                    <exclusion>
                        <groupId>com.company.package</groupId>
                    </exclusion>
                </exclusions>
            </configuration>
        </plugin>
    </plugins>
</build>

【问题讨论】:

CreateProcess error=206, The filename or extension is too long when running main() method的可能重复 实际上,在我发布我的问题之前,我已经看过那篇文章。 Brad Mace 的答案'你可以添加 useexternalfile="yes"' 不适用于我的情况。我认为 espinchi 提出的 7 个选项中至少有 1 个可以解决我的问题,但我不确定是哪一个。 然后,更新您的问题以获得帮助以确定 7 个选项中的哪一个对您的情况有效,或者转到该问题并询问 cmets?事实上,您提出的问题与重复出现的问题相同。 您是否尝试过在调试模式下运行 maven mvn -X ... 获取更多信息? 您是否可能遇到文件路径长度的 255 个字符限制? 【参考方案1】:

如果您有大量依赖项列表,则 -libraryjars 列表生成的执行 ProGaurd 的命令行可能会变得太长。在 Windows 上,错误消息可能类似于 CreateProcess error=206, The filename or extension is too long。

<putLibraryJarsInTempDir>true</putLibraryJarsInTempDir>

在插件配置中使插件将所有库 jar 复制到一个临时目录,并将该目录作为唯一的 -libraryjars 参数传递给 ProGuard。构建性能会差一点,但命令行会短很多。

有关 proguard maven 插件使用的详细信息,请参考他们的here

【讨论】:

【参考方案2】:

原因是通常 maven repo 位于用户的目录中,并且该路径为“类路径”上的每个 jar 添加,这使得它足够大以供 Windows 处理。

解决方案是您需要将您的 maven 存储库移动到更短的路径——比如 C:。为此,您需要编辑 maven settings.xml 并添加一个标签,如下图链接所示。完成此操作后,您可以运行 maven clean install。这应该可以解决问题。

Maven Issue

【讨论】:

【参考方案3】:

不知何故,就我们而言,ff。步骤消除了错误:

    比较组件的 pom.xml 中的依赖关系和 proguard-maven-plugin 标识的依赖关系。在我们的例子中,我们注意到 proguard-maven-plugin 识别了一些组件并不真正需要的依赖项。事实上,这些依赖项甚至都没有在组件的 pom.xml 中指定。

    执行第 1 步后,修改组件的 pom.xml 以排除 Proguard 已识别的不必要的依赖项(即,使用 exclusion 参数)。下面是一个示例 sn-p:

<build>
    <plugins>
        <plugin>
            <groupId>com.github.wvengen</groupId>
            <artifactId>proguard-maven-plugin</artifactId>
            <version>2.0.10</version>
            <executions>
                <execution>
                    <phase>package</phase>
                        <goals>
                            <goal>proguard</goal>
                        </goals>
                </execution>
            </executions>
            <configuration>
                <maxMemory>1024m</maxMemory>
                <proguardInclude>$basedir/proguard.conf</proguardInclude>
                <libs>
                    <lib>$java.home/lib/rt.jar</lib>
                    <lib>$java.home/lib/jce.jar</lib>
                </libs>
                <!-- For some reason, these components are included by the plugin even if they are not dependencies of SES components so we need to explicitly indicate to proguard-maven-plugin to exclude them. -->
                <exclusions>
                    <exclusion>
                        <groupId>p2.eclipse-plugin</groupId>
                        <artifactId>org.apache.geronimo.specs.geronimo-jms_1.1_spec</artifactId>
                    </exclusion>
                    <!-- other exclusions here -->
                </exclusions>
            </configuration>
            <dependencies>
                <dependency>
                    <groupId>net.sf.proguard</groupId>
                    <artifactId>proguard-base</artifactId>
                    <version>5.2</version>
                    <scope>runtime</scope>
                </dependency>
            </dependencies>
        </plugin>
    </plugins>
</build>

【讨论】:

以上是关于执行proguard-maven-plugin时,出现“CreateProcess error=206, The filename or extension is too long”的主要内容,如果未能解决你的问题,请参考以下文章

maven混淆Java代码

Spring Boot 和 Proguard

maven混淆Java代码

剖析执行时(让你看懂执行时)

iOS 执行时

小记---------手动执行脚本正常执行,使用crontab定时执行时 不执行