【问题标题】:Maven Spring jar packagingMaven Spring jar 打包
【发布时间】:2011-06-06 09:57:06
【问题描述】:

我们创建了一个 jar(Spring 项目),我们将在另一个 Spring 项目(war)中使用 Maven

如果我们包含所需的依赖项,我们可以毫无问题地使用它。

如果我想确保 jar 包含它的所有依赖项并使用它们,那么最好的方法是什么?

为了避免包含我在使用 maven 程序集插件时尝试过的依赖项 其中肯定包含文件 - 但这些似乎被忽略了,因为它们仍然需要作为消费项目中的依赖项 - 有什么建议吗?

程序集插件的 POM 详细信息

<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <configuration>
                <source>1.5</source>
                <target>1.5</target>
            </configuration>
        </plugin>
         <plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2.1</version>
    <configuration>
      <descriptorRefs>
        <descriptorRef>jar-with-dependencies</descriptorRef>
      </descriptorRefs>

    </configuration>
    <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>
  </plugin>

【问题讨论】:

  • 如果您发布您的程序集插件描述符会很有帮助。

标签: java spring maven


【解决方案1】:

您可以使用 maven winstone 插件创建一个独立的可执行 jar,其中包含 war、jar 等的所有依赖项......

添加

<plugins>
  <plugin>
    <groupId>net.sf.alchim</groupId>
    <artifactId>winstone-maven-plugin</artifactId>
    <version>1.2</version>
    <executions>
      <execution>
        <goals>
          <goal>embed</goal>
        </goals>
        <phase>install</phase>
      </execution>
    </executions>
    <configuration>
      <filename>${project.parent.build.finalName}.jar</filename>
    </configuration>
  </plugin>
  ...
</plugins>

将您的应用程序的所有模块、wars 和 jar 以及任何所需的依赖项捆绑在一个包含 servlet 引擎的可执行 jar 中。

为您的 Ops 团队提供一个可部署的捆绑包进行部署非常有用。

我建议不要创建一个包含战争要使用的所有依赖项的 jar。您可能会在类路径中得到相同类的略有不同版本的多个副本。某些库有点 euhhmmm,...,关于这个(hibernate 和 log4j 浮现在脑海中)。

Maven 在确定要采用哪些依赖项方面做得不错,如果出现问题,mvn dependency:tree 会让事情变得更加清晰。当你创建一个 uber-jar 时,你会丢失它。

如果有充分的理由这样做,我会推荐一个可以严格控制类路径的环境,例如成熟的 J2EE 服务器或使用 OSGi 容器。但是,请注意您想要的:这些小猫不能在没有(铁)手套的情况下处理。

【讨论】:

  • winstone-maven-plugin:1.2:embed (default) --- [INFO] 仅适用于包装 == 'war' 我想将其打包为 jar 以便能够包含它在其他代码中
  • 谢谢彼得。由于我对此比较陌生,我认为这将是分发共享代码的更好方式,接受你所说的,并确保人们将依赖项添加到战争中
  • 我扩展了关于为模块创建用户 jar 的答案。我会认真建议远离那里,以免跌入地狱。 Maven 和其他构建工具在处理依赖项方面做得很好,类路径上没有重复项。另一种解决方案是“简单地”独立部署 jar,与 WAR 分开,并通过某种 RPC 进行讨论,然后其他客户端也可以使用。
  • 还有maven shade插件。它通过将包含的类移动到另一个包中来解决这个问题。见maven.apache.org/plugins/maven-shade-plugin/examples/…
【解决方案2】:

我使用以下程序集配置来创建一个包含所有运行时依赖项的 jar:

<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>runnable</id>
    <formats>
        <format>jar</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <unpack>true</unpack>
            <scope>runtime</scope>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <fileSet>
            <directory>${project.build.outputDirectory}</directory>
            <includes>
                <include>*.jar</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>

【讨论】:

    猜你喜欢
    • 2019-12-11
    • 2013-01-30
    • 2019-06-21
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2020-08-06
    • 2023-03-20
    • 2015-06-10
    相关资源
    最近更新 更多