【问题标题】:combination of shade, proguard and appassembler maven pluginsshade、proguard 和 appassembler maven 插件的组合
【发布时间】:2017-02-28 10:13:42
【问题描述】:

我正在尝试使用 maven 构建和混淆一个多模块项目。我使用 shade 插件创建了一个包含我自己的所有类文件(每个模块)的 fat jar,以便我可以使用 proguard-maven-plugin 混淆 fat jar,然后使用 appassembler 插件创建可执行的构建输出。一切正常,除了其他模块依赖项也出现在 appassembler repo 目录中,这是错误的,因为阴影 jar 中已经存在混淆的类。

我尝试定义提供的其他模块依赖项,然后添加阴影插件的依赖项,但阴影插件似乎忽略了它们。

这是 pom.xml 的相关部分:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <outputFile>${project.build.directory}/${project.build.finalName}-shaded.${project.packaging}</outputFile>
                        <artifactSet>
                            <includes>
                                <include>${project.groupId}:*</include>
                            </includes>
                        </artifactSet>
                    </configuration>
                </execution>
            </executions>
            <dependencies>
                <dependency>
                    <groupId>${project.groupId}</groupId>
                    <artifactId>module-a</artifactId>
                    <version>${project.version}</version>
                </dependency>
                <dependency>
                    <groupId>${project.groupId}</groupId>
                    <artifactId>module-b</artifactId>
                    <version>${project.version}</version>
                </dependency>
            </dependencies>
        </plugin>

        <plugin>
            <groupId>com.github.wvengen</groupId>
            <artifactId>proguard-maven-plugin</artifactId>
            <version>2.0.13</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>proguard</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <injar>${project.build.finalName}-shaded.${project.packaging}</injar>
                <outjar>${project.build.finalName}.${project.packaging}</outjar>
                <proguardInclude>proguard.pro</proguardInclude>
                <maxMemory>1024m</maxMemory>
                <libs>
                    <lib>${java.home}/lib/rt.jar</lib>
                    <lib>${java.home}/lib/jce.jar</lib>
                </libs>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>appassembler-maven-plugin</artifactId>
            <version>2.0.0</version>
            <executions>
                <execution>
                    <id>assemble</id>
                    <phase>package</phase>
                    <goals>
                        <goal>assemble</goal>
                    </goals>
                    <configuration>
                        <programs>
                            <program>
                                <mainClass>my.package.Application</mainClass>
                            </program>
                        </programs>
                        <useWildcardClassPath>true</useWildcardClassPath>
                        <repositoryLayout>flat</repositoryLayout>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

欢迎提出任何想法。

【问题讨论】:

  • 你的 pom.xml 在哪里?你用了什么命令?你能提供maven输出吗?
  • @Asettouf mvn 全新安装。构建成功,但阴影 jar 不包含 module-a 和 module-b 类

标签: maven proguard maven-shade-plugin appassembler


【解决方案1】:

我找到了一个解决方案,它不像我想要的那么方便,但它比手动删除其他模块 jar 更好。我使用程序集插件从构建分发 zip 中排除 jar。

pom.xml:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                    <configuration>
                        <outputFile>${project.build.directory}/${project.build.finalName}-shaded.${project.packaging}</outputFile>
                        <artifactSet>
                            <includes>
                                <include>${project.groupId}:*</include>
                            </includes>
                        </artifactSet>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>com.github.wvengen</groupId>
            <artifactId>proguard-maven-plugin</artifactId>
            <version>2.0.13</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>proguard</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <injar>${project.build.finalName}-shaded.${project.packaging}</injar>
                <outjar>${project.build.finalName}.${project.packaging}</outjar>
                <proguardInclude>proguard.pro</proguardInclude>
                <maxMemory>1024m</maxMemory>
                <libs>
                    <lib>${java.home}/lib/rt.jar</lib>
                    <lib>${java.home}/lib/jce.jar</lib>
                </libs>
            </configuration>
        </plugin>

        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>appassembler-maven-plugin</artifactId>
            <version>2.0.0</version>
            <executions>
                <execution>
                    <id>assemble</id>
                    <phase>package</phase>
                    <goals>
                        <goal>assemble</goal>
                    </goals>
                    <configuration>
                        <programs>
                            <program>
                                <mainClass>my.package.Application</mainClass>
                            </program>
                        </programs>
                        <useWildcardClassPath>true</useWildcardClassPath>
                        <repositoryLayout>flat</repositoryLayout>
                    </configuration>
                </execution>
            </executions>
        </plugin>

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.0.0</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <descriptors>
                            <descriptor>descriptor.xml</descriptor>
                        </descriptors>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

descriptor.xml:

<assembly xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
      xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
<id>distribution</id>
<formats>
    <format>zip</format>
</formats>
<fileSets>
    <fileSet>
        <directory>${project.build.directory}/appassembler</directory>
        <excludes>
            <exclude>**/module-a-${project.version}.${project.packaging}</exclude>
            <exclude>**/module-b-${project.version}.${project.packaging}</exclude>
        </excludes>
        <outputDirectory>/</outputDirectory>
    </fileSet>
</fileSets>

【讨论】:

    【解决方案2】:

    我认为您的问题来自这样一个事实,即阴影 jar 和 appassembler 在同一阶段运行,package

    我认为您应该尝试将 appassembler 插件的阶段修改为:

    <phase>post-package</phase>
    

    【讨论】:

    • 我不认为 maven 有 post-package 阶段。但我认为这不是问题,因为我的目标中的 ${project.build.finalName}-shaded.${project.packaging} 文件也不包含 module-a 和 module-b 类。 AFAIK maven 按照它们在 pom 中看到的顺序执行相同的阶段执行
    • 请参阅:maven.apache.org/guides/introduction/…。对于每个 X 阶段,您都有一个 pre-X、post-X 和 process-X 阶段。如果你不想使用 post-package,你可以使用 install 阶段
    • 我没有找到您在该链接中提到的内容。见stackoverflow.com/questions/26607834/…。但尽管如此,在 appassembler(或任何其他随机词)的后打包或安装阶段构建项目奇怪地没有导致任何错误,但仍然导致相同的输出。
    • 你用什么命令来运行maven?命令的输出是什么?
    • mvn clean install。虽然考虑到它是一个大项目和proguard,但产量相当大。但是构建是成功的,并且阴影插件输出由[INFO] Excluding org.springframework.boot:spring-boot-starter-actuator:jar:1.5.1.RELEASE from the shaded jar. 之类的行组成,这些行由我的&lt;include&gt;${project.groupId}:*&lt;/include&gt; 配置证明。
    猜你喜欢
    • 1970-01-01
    • 2017-08-27
    • 2014-07-23
    • 2015-02-05
    • 2015-08-20
    • 1970-01-01
    • 2021-12-13
    • 2012-05-22
    • 2021-11-24
    相关资源
    最近更新 更多