【问题标题】:Creating a self-contained source release with Maven使用 Maven 创建一个独立的源代码版本
【发布时间】:2010-11-09 11:55:02
【问题描述】:

到目前为止,我们在我的公司使用 Ant。每当我们想将应用程序发送到客户端时,我们都会运行一个特殊的 Ant 脚本,该脚本将我们所有的源代码与所有 jar 库和 Ant 本身以及一个简单的批处理文件打包在一起。

然后客户端可以将文件放在完全没有网络访问权限(甚至 Ant 也没有)的计算机上并运行批处理文件。只要计算机具有有效的 JDK,批处理脚本就会使用 jar 编译所有代码并创建最终由客户端部署在应用程序服务器上的 WAR/EAR。

最近我们迁移到了 Maven 2。但我还没有找到一种方法来做同样的事情。我见过 Maven 程序集插件,但这只是创建源代码分发或二进制分发。我们的场景实际上是一个混合体,因为它包含我们的源代码和我们使用的库的二进制 jar(例如 Spring、Hibernate)

那么是否可以使用 Maven 创建一个可以在完全没有网络访问权限的计算机上运行的自包含程序集/发布/包?这意味着所有的库都应该包含在里面。

如果 Maven 本身也包含在其中,则额外的好处,但这不是一个严格的要求。最终的包应该可以通过一个命令轻松编译(系统管理员很容易执行)。

我正在考虑为此编写自己的 Maven 插件,但我怀疑有人已经遇到过这个问题。

【问题讨论】:

    标签: java maven-2 migration release self-contained


    【解决方案1】:

    从您的开发环境中,如果您在构建插件下包含以下内容

    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
    </plugin>
    

    并调用 mvn assembly:assembly,您将在目标文件夹中获得 yourApp-version-with-dependencies.jar。这是一个自给自足的 jar,并带有 Main-class MANIFEST.MF 条目,任何人都可以双击并运行该应用程序。

    【讨论】:

    • 我已经看过汇编插件了。这里的问题是客户希望自己从源代码编译代码。他们不想要预编译的 jar。不过还是谢谢。
    【解决方案2】:

    你可以试试这个方法:

    • 使用 mvn ant:ant 创建 ant build 来自 maven 项目的脚本
    • 确保ant是项目依赖
    • 使用程序集构建蚂蚁
      系统

    或计划 b:

    • 使用 mvn ant:ant 创建 ant build 来自 maven 项目的脚本
    • 确保 ant 是项目依赖项
    • 编写“引导类”来调用 Ant 并运行构建
    • 使用appassembler 构建一个 脚本化构建和安装环境

    在计划 b 中,您将编写脚本以从打包的源 jar 的某个位置设置源树,然后使用 appassembler 构建 bat 或 sh 脚本来调用引导程序并通过 ant 构建。您的引导程序可以在构建之前或之后执行您需要做的任何事情。

    希望这会有所帮助。

    【讨论】:

    • 不错!我不知道 ant:ant
    【解决方案3】:

    也许我为类似问题提交的答案可能会有所帮助。请参阅Can maven collect all the dependant jars for a project to help with application deployment? 缺少的一件是如何在程序集中包含源代码。我不得不想象有一些方法可以使用程序集插件来管理它。这也没有解决在发行版中包含 Maven 的问题。

    从 Ant 迁移到 Maven 的原因是什么?听起来您使用 Ant 解决方案一切顺利,那么 Maven 在这里为您买了什么?

    如果只是依赖管理,techniques for leveraging Maven from Ant 可以让您两全其美。

    【讨论】:

    • 我们从 Ant 迁移到 Maven,主要是因为 Ant 脚本变得过于复杂,并且在某些时候,它们内部包含硬编码路径,使得它们无法在构建服务器以外的任何其他系统上运行。现在也更容易知道项目中使用了哪些库(和许可证)。
    【解决方案4】:

    源插件将为您提供一个包含 probject "source:jar" 源的 jar。然后,您可以使用程序集插件将来自内部项目的源 jar(使用源来引用这些源 jar)和来自外部项目的二进制 jar 合并到一个发行版中。

    然而,至于把它变成一个可编译的单元,我没有任何建议。您当然可以捆绑 maven,但您需要创建一个包含构建项目所需的所有插件的捆绑包!我不知道任何现有的工具可以做到这一点。

    【讨论】:

    • 哈!是的,这是棘手的部分。如何获得可编译的单元!
    【解决方案5】:

    这就是我的做法……在 pom 的构建部分添加:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <executions>
                    <execution>
                        <id>attach-sources</id>
                        <phase>verify</phase>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
    

    然后在配置文件部分添加此位:

    <profiles>
            <profile>
                <id>release</id>
                <build>
                    <plugins>
                        <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-source-plugin</artifactId>
                            <executions>
                                <execution>
                                    <goals>
                                        <goal>jar</goal>
                                    </goals>
                                </execution>
                            </executions>
                        </plugin>
                    </plugins>
                </build>
            </profile>
        </profiles>
    

    当我进行 maven 安装时,它会构建 jar 并签入源代码的 jar。

    【讨论】:

    • 这有什么帮助?客户端不希望 jar 文件中的源。他们想用一个命令自己编译源代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-13
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    相关资源
    最近更新 更多