maven打包时遇到两个全限定类名相同的类

我使用的一个第三方的jar包,里边有一个类不是public的,但是我需要用,我就在自己的项目里创建了相同的包名,把这个类拷贝过来,改成public类。

现在问题出在打包后,解压缩查看打包后的jar,两份类文件都被包含进去了。
image.png

pom.xml中的配置.

<build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>PreMainTraceAgent</mainClass>
                        </manifest>
                        <manifestEntries>
                            <Class-Path>.</Class-Path>
                            <Premain-Class>PreMainTraceAgent</Premain-Class>
                            <Agent-Class>PreMainTraceAgent</Agent-Class>
                            <Can-Redefine-Classes>true</Can-Redefine-Classes>
                            <Can-Retransform-Classes>true</Can-Retransform-Classes>
                        </manifestEntries>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>


        </plugins>
    </build>

首先我确实需要让所有依赖都在一个jar包中,所有不能通过配置加载顺序规避这个问题。
我可以把那个库修改一个重新打包,这是一个解决办法。
我现在想的是,能不能修改打包配置,让最后生成的jar中只保留我修改过的那一份。

根据回答,使用maven-assembly-plugin插件,时间:4月20号17点。

image.png

image.png

只保留一份类这个确实符合预期,这个昨天没注意到,确实是我都问题。

阅读 4.4k
1 个回答

可以自己指定maven-assembly-plugin插件的打包描述符,在这个描述符中,可以指定排除JAR包中的哪些资源。例如:

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <configuration>
        <descriptors>
            <descriptor>${project.basedir}/assembly-descriptor.xml</descriptor>
        </descriptors>
        <!-- <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs> -->
    </configuration>
</plugin>

assembly-descriptor.xml文件内容参考如下:
注意核心是 unpackOptions/excludes,JAR解压缩选项 -> 排除JAR包内的资源,源码编译后的文件不受限制。

<?xml version='1.0' encoding='UTF-8'?>
<assembly
    xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0  
                    http://maven.apache.org/xsd/assembly-1.1.0.xsd">
    <id>assembly-descriptor</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <fileSets>
        <fileSet>
            <directory>${project.build.directory}/classes</directory>
            <outputDirectory>/</outputDirectory>
        </fileSet>
    </fileSets>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <unpack>true</unpack>
            <unpackOptions>
                <excludes>
                    <!-- 使用通配符*解决内部类的问题,但是要小心其他以Felix开头的类 -->
                    <exclude>org/apache/felix/framework/Felix*.class</exclude>
                    <exclude>org/apache/felix/framework/BundleImpl.class</exclude>
                </excludes>
            </unpackOptions>
        </dependencySet>
    </dependencySets>
</assembly>
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题