如何在不使用 maven 的情况下创建 jar 时排除某些 Jar 依赖项?

How to Exclude Certain Jar Dependencies while creating jar without using maven?

我正在做一个核心 Java 项目。我正在编写 Apache Storm 拓扑,需要在将拓扑绑定到 jar 时排除 storm jar。有没有不使用maven的方法来做到这一点?我知道使用 maven 我们可以使用 <scope>provided</scope> 但我需要一个替代方法。

PS: 我正在使用 Eclipse。

我使用 Gradle 编译拓扑的 JAR 文件。它允许您在生成 JAR 文件时排除某些文件。

下面的示例显示了我在 build.gradle 文件中使用的设置

   apply plugin: 'java'
    apply plugin: 'eclipse'


    configurations {
        provided
        compile.extendsFrom provided
    }

    jar {
        dependsOn configurations.runtime

        from {
            (configurations.runtime - configurations.provided).collect {
                it.isDirectory() ? it : zipTree(it)
            }
        }

        manifest {
            attributes 'Main-Class': 'com.example.myclass'
        }
    }

    dependencies {
        provided files('./lib/asm-4.0.jar')
        provided files('./lib/carbonite-1.4.0.jar')
        # ... The rest of the Storm jars found in the lib directory of your storm installation
    }

默认情况下 Gradle 期望的目录结构是

MyProjectName
    - build.gradle
    - src
       - main
            - java
                - [Your Java Files]
            - resources
                - resources
                    - [Mutlilang files / other resources]

当您在包含 build.gradle 文件的目录中 运行 gradle build 时,在命令行中应生成一个 JAR 文件.\build\libs

还有一个Gradle plugin for eclipse

如果您使用 Maven 而不是 Gradle,并且您来这里是为了在构建中排除 Storm 的库,我有解决方案和一个工作示例。

documentation of Storm tells us to exclude the Storm dependency and provides a link to a page of Maven 解释了如何做,但缺少完整的示例。事实证明,我们必须创建另一个 XML 文件作为程序集配置的描述符,而不是直接将配置放在 pom.xml 中,即使 Eclipse 没有抱怨将两个文件在一起。

方法如下:

我们有 pom.xmlassembly 插件,指向另一个描述符 xml 文件:

<plugin>                                                                                
    <artifactId>maven-assembly-plugin</artifactId>                                      
    <executions>                                                                        
        <execution>                                                                     
            <id>make-assembly</id> <!-- this is used for inheritance merges -->         
            <phase>package</phase> <!-- bind to the packaging phase -->                 
            <goals>                                                                     
                <goal>single</goal>                                                     
            </goals>                                                                    
        </execution>                                                                    
    </executions>                                                                       
    <configuration>                                                                     
        <descriptors>                                                                   
            <descriptor>/src/main/resources/exclude-storm.xml</descriptor>              
        </descriptors>                                                                  
        <archive>                                                                       
            <manifest>                                                                  
                <mainClass>path.to.main.class</mainClass> 
            </manifest>                                                                 
        </archive>                                                                      
        <descriptorRefs>                                                                
            <descriptorRef>jar-with-dependencies</descriptorRef>                        
        </descriptorRefs>                                                               
    </configuration>                                                                    
</plugin>     

注意部分:(应该是完整路径)

<descriptors>                                                                   
    <descriptor>/src/main/resources/exclude-storm.xml</descriptor>              
</descriptors>

并且在这个路径中:

<?xml version="1.0" encoding="UTF-8"?>
<assembly xmlns="http://maven.apache.org/ASSEMBLY/2.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd">
    <id>exclude-storm</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/</outputDirectory>
            <useProjectArtifact>false</useProjectArtifact>
            <unpack>true</unpack>
            <scope>compile</scope>   <!-- note here!!!! -->
            <excludes>
                <exclude>org.apache.storm:storm-core:jar:1.1.1</exclude>
            </excludes>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <fileSet>
            <outputDirectory>/</outputDirectory>
            <directory>${project.build.outputDirectory}</directory>
        </fileSet>
    </fileSets>
</assembly>

这里我们添加Maven doc页面的设置。

最重要的是:排除格式:应该是:(ref)

groupId:artifactId:type[:classifier]:version

还有范围! runtime 是默认的,我把它改成 compile 就可以了。

最后编译的时候使用:

clean assembly:assembly

并打开调试输出以在控制台中查看完整输出。如果你:

  • 构建成功
  • 搜索输出但未找到类似以下内容的内容:[WARNING]The following patterns were never triggered in this artifact inclusion filter: o 'org.apache.storm:storm-core:jar:1.1.1'.
  • 罐子里没有 default.yaml

那你就知道你成功了。

感谢另一个问答的启发:How to exclude dependencies from maven assembly plugin : jar-with-dependencies?