有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将一个jar打包成一个dist dir,其中包含独立的外部资源和依赖项

以下是我试图实现的目标-一个dist目录(或zip文件),看起来像这样:

dist/
|-- application-1.0.jar
|-- conf/
    |-- application.properties
    |-- log4j.properties
|-- lib/
    |-- *.jar

基本上:

  • 生成一个可执行jar(清单中有适当的类路径)
  • 我想将src/main/resources从jar的自动打包中排除,以便可以修改application.properties
  • 我希望在lib/目录中有外部依赖项

我提出了一个解决方案,使用一个配置文件,在包阶段附加插件,但是使用汇编插件会是一个更好的解决方案吗


共 (2) 个答案

  1. # 1 楼答案

    您需要使用两个插件来完成此任务:maven-jar-pluginmaven-assembly-plugin

    有用的pom.xml示例:

    (我建议您将用户可编辑属性文件分离到单独的目录中,但这是一个品味问题。)

    示例程序集配置,要开始,请执行以下操作:

    <assembly>
      <id>dist</id>
      <formats>
        <format>zip</format>
      </formats>
      <includeBaseDirectory>true</includeBaseDirectory>
      <baseDirectory>dist</baseDirectory>
      <dependencySets>
        <dependencySet>
          <outputDirectory>lib</outputDirectory>
          <scope>runtime</scope>
        </dependencySet>
      </dependencySets>
      <fileSets>
        <fileSet>
          <directory>src/conf</directory>
          <outputDirectory>conf</outputDirectory>
        </fileSet>
        <fileSet>
          <directory>src/run</directory>
          <outputDirectory></outputDirectory>
          <excludes>
            <exclude>*.sh</exclude>
          </excludes>
        </fileSet>
      </fileSets>
      <files>
        <file>
          <source>src/run/run.sh</source>
          <outputDirectory></outputDirectory>
          <fileMode>0755</fileMode>
        </file>
      </files>
    </assembly>
    
  2. # 2 楼答案

    使用assembly插件的解决方案有几个部分:

    • pom包括配置jar插件(maven-jar-plugin)和配置汇编插件(maven-assembly-plugin
    • 在maven的打包阶段,调用jar插件来构建应用程序jar
    • 然后运行程序集插件,并将构建的jar、资源和依赖项组合到程序集文件(distribution-zip.xml)定义的zip文件中

    在pom中,配置插件:

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-jar-plugin</artifactId>
                <version>2.2</version>
                <configuration>
                    <archive>
                        <!  Make an executable jar, adjust classpath entries >
                        <manifest>
                            <addClasspath>true</addClasspath>
                            <classpathPrefix>./lib/</classpathPrefix>
                            <mainClass>com.acme.KillerApp</mainClass>
                        </manifest>
                        <! Resources will be placed under conf/ >
                        <manifestEntries>
                            <Class-Path>./conf/</Class-Path>
                        </manifestEntries>
                    </archive>
                    <! exclude the properties file from the archive >
                    <excludes>
                        <exclude>*.properties</exclude>
                    </excludes>
                </configuration>
            </plugin>
    
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2-beta-5</version>
                <configuration>
                    <descriptors>
                        <descriptor>${basedir}/assembly/distribution-zip.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
    ...
    

    程序集文件distribution-zip.xml的内容(感谢Neeme Praks)结合了创建的jar、资源和依赖项:

    <assembly>
        <id>dist</id>
        <formats>
            <format>zip</format>
        </formats>
    
        <includeBaseDirectory>true</includeBaseDirectory>
    
        <dependencySets>
            <dependencySet>
                <! Include runtime dependencies >
                <outputDirectory>lib</outputDirectory>
                <scope>runtime</scope>
            </dependencySet>
        </dependencySets>
    
        <fileSets>
            <fileSet>
                <! Get the generated application jar >
                <directory>${project.build.directory}</directory>
                <outputDirectory>/</outputDirectory>
                <includes>
                    <include>*.jar</include>
                </includes>
            </fileSet>
            <fileSet>
                <! Get application resources >
                <directory>src/main/resources</directory>
                <outputDirectory>conf</outputDirectory>
            </fileSet>
            <fileSet>
                <! Get misc user files >
                <directory>${project.basedir}</directory>
                <outputDirectory>/</outputDirectory>
                <includes>
                    <include>README*</include>
                    <include>LICENSE*</include>
                    <include>NOTICE*</include>
                </includes>
            </fileSet>       
        </fileSets>
    </assembly>
    

    生成的可分发zip文件被创建为target/killer-app-1.0-dist.zip