Java 使用Maven创建自包含的源代码版本

Java 使用Maven创建自包含的源代码版本,java,maven-2,migration,release,self-contained,Java,Maven 2,Migration,Release,Self Contained,到目前为止,我们公司使用Ant。每当我们想要将应用程序发送到客户机时,我们都会运行一个特殊的Ant脚本,该脚本将所有源代码、所有jar库和Ant本身以及一个简单的批处理文件打包在一起 然后,客户端可以将文件放在一台根本没有网络访问权限的计算机上(甚至连Ant都没有),然后运行批处理文件。只要计算机有一个有效的JDK,批处理脚本就会使用JAR编译所有代码,并创建一个WAR/EAR,最终由客户端部署到应用服务器上 最近我们迁移到Maven 2。但是我还没有找到一种方法来做同样的事情。我见过Maven

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

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

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

那么,有没有可能用Maven创建一个独立的程序集/发行版/软件包,让一个人可以在没有网络访问的计算机上运行???这意味着所有库都应该包含在其中

如果Maven本身也包含在内部,则会有额外的奖励,但这不是严格的要求。最终的包应该只需一个命令即可轻松编译(系统管理员可以轻松执行)


我正考虑为此编写自己的Maven插件,但我怀疑已经有人遇到过这种情况。

也许我提交的一个类似问题的答案会有所帮助。请看缺少的一部分是如何在程序集中包含源代码。我不得不想象有一种方法可以通过汇编插件来管理它。这也没有解决在发行版中包含Maven的问题

从Ant迁移到Maven的原因是什么?听起来你已经用Ant解决方案解决了所有问题,那么Maven在这里给你买了什么呢


如果只是依赖关系管理,那么就有一些方法可以让你两全其美。

源插件会给你一个jar,其中包含一个probject“source:jar”的源代码。然后,您可以使用汇编插件将来自内部项目的源jar(使用源引用这些源jar)和来自外部项目的二进制jar组合到一个发行版中


但是,对于如何将其转换为可编译单元,我没有任何建议。您当然可以捆绑maven,但您需要创建一个包含构建项目所需的所有插件的捆绑包!我不知道有任何现有的工具可以做到这一点。

您可以尝试以下方法:

  • 使用mvn ant:ant创建ant构建 来自maven项目的脚本
  • 确保ant是项目依赖项
  • 使用程序集构建ant
    系统
或计划b:

  • 使用mvn ant:ant创建ant构建 来自maven项目的脚本
  • 确保ant是项目依赖项
  • 编写一个“引导类”来调用Ant并运行构建
  • 用于构建 脚本化构建和安装环境
在计划b中,您将编写脚本,从打包的源jar在某处建立源代码树,然后使用appassembler build bat或sh脚本调用引导程序并通过ant进行构建。您的引导程序可以在构建之前或之后执行任何需要执行的操作


希望这有帮助。

我就是这样做的。。。在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>

org.apache.maven.plugins
maven源插件
附加来源
验证
罐子
然后在配置文件部分添加此位:

<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>

释放
org.apache.maven.plugins
maven源插件
罐子

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

从您的开发环境中,如果您包含以下内置插件

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

maven汇编插件
带有依赖项的jar

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

我们从Ant迁移到Maven,主要是因为Ant脚本变得太复杂了,并且在某些时候内部有硬编码的路径,使得它们不可能在构建服务器以外的任何其他系统上运行。现在更容易知道项目中使用了哪些库(和许可证)。很好!我不知道ant:antI已经看过汇编插件了。这里的问题是,客户机希望自己从源代码编译代码。他们不想要预编译的jar。不过还是要谢谢你。这有什么帮助?客户端不希望源文件位于jar文件中。他们想用一个命令自己编译源代码。哈!是的,这是棘手的部分。如何获得可编译单元!