如何避免清单文件被proguard覆盖

时间:2014-04-22 10:38:30

标签: maven replace manifest proguard overwrite

我在我的java应用程序中使用了几个库。

在pom.xml中,proguard maven插件包含它们,如下所示:

<inclusion>
    <groupId>javafx</groupId>
    <artifactId>jfxrt</artifactId>
    <library>true</library>
    <filter>!META-INF/**</filter>
</inclusion>

我注意到,只有当我将<library>设置为true的库包含时,才会替换清单文件,尽管我为所有库指定了<filter>。 但是我需要将<library>设置为true来包含它们,否则其中一些不会工作。

现在在构建jar后,它不会启动,因为Manifest不再包含主类的路径。

我找到了两种方法来解决这个问题。但是,两者都不起作用。

第一种方法:

    <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.3</version>
    <executions>
        <execution>
            <phase>install</phase>
            <configuration>
                <tasks>
                    <echo
                        message="Adding Manifest to  ${project.build.directory}/${my.outfilename}.jar" />
                    <manifest file="META-INF/MANIFEST.MF" mode="replace">
                        <attribute name="Manifest-Version" value="1.0" />
                        <attribute name="Package"
                            value="com.xyz.mypackage" />
                        <attribute name="Main-Class" value="MyMainClass" />
                        <attribute name="Version"
                            value="${my.version.main}${my.version.sub}" />
                    </manifest>
                </tasks>
            </configuration>
        </execution>
    </executions>
</plugin>

根本没有任何事情发生。我已设置<phase>进行安装和部署。两者都没有效果。

第二种方法:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
    <executions>
        <execution>
            <phase>deploy</phase>
            <configuration>
                <archive>
                    <manifestFile>${basedir}/build/MANIFEST.MF</manifestFile>
                </archive>
            </configuration>
        </execution>
    </executions>
</plugin>

这也没有任何改变。即使用-X来获得调试输出,我也看不到其中一个插件是否被执行过。这两个<plugin>部分都位于<build><plugins></plugins></build>

之内

现在我真的陷入困境,因为在自行构建过程中,在构建jar之后手动更改Manifest文件是不可接受的。

希望你能提供帮助。谢谢!

1 个答案:

答案 0 :(得分:1)

我花了好几天才弄明白这一点。实际上它很简单:

在proguard-maven-plugin的<configuration>部分中添加以下内容:

<archive>
     <manifest>
        <mainClass>MyMainClass</mainClass>
        <packageName>com.xyz.abc</packageName>
    </manifest>
</archive>

这将在Manifest中添加一行,其中包含指定的Main类