2009-02-19 28 views
5

我构建了一个独立的Java应用程序,该应用程序具有一堆依赖项(Apache Commons库等)以及Spring框架的依赖项,而该框架依次包含一堆依赖。打包并运行具有弹簧依赖性的Java应用程序

我在Eclipse中构建了它,它运行良好。现在我需要将它部署到生产环境中,所以我试图找出将它与所有依赖关系进行打包的最佳方法,以及如何调用该对象(它将从命令行调用)。

蛮力的方式是将我的项目导出为jar,找到所有依赖的jar(及其依赖关系!),将它们复制到公共目录,编写一个包含classpath中每一个的shell脚本和运行。显然,这似乎很愚蠢和乏味。

我应该使用Ant吗,Maven?我应该将所有依赖的Spring JAR包装成一个大文件吗?处理这个问题的任何提示都会有帮助。

回答

4

2009年的Java部署仍然很愚蠢乏味,因此通常的选择是编写这个小脚本。如果您将所有JAR放入一个目录(例如,lib\),则可以使用自动构建类路径的通用脚本(请参阅this blog entry)。我建议在开始时添加一个cd /d %~dp0以将其放入脚本的目录中。

Maven 2有一个插件,可以在一个“超级JAR”(mvn assembly:assembly)中组装你的应用程序。除非您使用DB2 JCC驱动程序(其中包含“COM.ibm。”软件包,该软件包将转换为com.ibm。 - > ClassNotFoundException),否则这将起作用。

最后一个解决方案,如果你已经有了一个ANT build.xml,那就是解压所有依赖JAR并自己创建一个“超级JAR”。

1

我们发现依赖管理和打包的最佳解决方案是使用Maven和Assembly插件。这提供了一个非常优雅的方式来打包项目,以及所有的运行时依赖和支持脚本到二进制分发。使用程序集的最大优点之一是可以根据需要将项目拆分为不同的组件。如果您使用的是Spring Integration,那么很常见的是,您可以将单独的组件拆分到多台机器上。程序集插件允许您根据需要进行配置。

0

您可以使用启动器来正确设置类路径。然后,您将拥有更多的灵活性来打包您的JAR。你可以很容易地把它们全部放在一个目录中,这比创建一个“混蛋”的超级罐子更干净...

其中一个这样的发射器是commons-launcher

2

使用Ant,你可以做一些事情大致如下:

  1. 集团所有依赖在一起。
  2. 将JAR文件打包到您的应用程序中,然后在jar文件中将对MANIFEST.MF文件中的依赖项的引用嵌入到“Class-Path”-directive中。这应该消除在启动时构建类路径的需要。
  3. 将它们全部捆绑在一起存档,然后分发它。用“java -jar your.jar”直接运行jar就足够了。

要管理您的依赖关系,您可以使用Ivy。与Maven非常相似,它可以在构建时从您配置的任何存储库(包括Maven存储库或您自己的私有存储库)检索依赖项。

0

我们使用Maven 2和m2eclipse插件;工作很好。插件具有依赖关系图视图,将显示冲突等。

现在,如果要将所有依赖关系打包到单个jar中,可以查看Jar Jar Links(别开玩笑!)。

0

如果您制作JAR可执行文件并添加包括ClassPath的清单,您的许多问题都会消失。不幸的是,您必须一起压缩JAR及其依赖关系,但您的CLASSPATH问题已得到解决。

创建一个OSGi包怎么样?我还没有看过它,但它应该是打包Java应用程序的下一个东西。它用在像Spring的dm Server这样的应用服务器中。也许它可以帮助你。

0

在我的ANT构建脚本中,我生成了* .bat和* .sh启动脚本,其中包含基于构建的lib目录的内容在构建时动态构建的JAR列表。

例如,创建jar的列表中适当的分隔符:

<path id="jar-classpath"> 
    <fileset dir="${build.war.dir}/WEB-INF/lib"> 
     <include name="**/*.jar" /> 
    </fileset> 
</path> 

<pathconvert refid="jar-classpath" targetos="unix" property="exec.classpath.unix"> 
     <map from="${build.war.dir}\WEB-INF\lib\" to="../lib/"/> 
</pathconvert> 

<pathconvert refid="jar-classpath" targetos="windows" property="exec.classpath.windows"> 
     <map from="${build.war.dir}\WEB-INF\lib\" to="../lib/"/> 
</pathconvert> 

然后,您可以在Java调用脚本使用${exec.classpath.unix}${exec.classpath.windows}值。

1

所有这些Maven的爱和没有人提到艾维?噢亲爱的!

那么,这里的Ant Ivy和这里的comparison to Maven2。几乎每个人都在提出建议之前,请先看看它。

0

你也可以使用摇篮,这里是你如何能做到这有:

mainClassName = "my.App" 

task runnableJar(type: Jar, dependsOn: [':assemble']) { 
    from files(sourceSets.main.output.classesDir) 
    from files(sourceSets.main.output.resourcesDir) 
    from configurations.runtime.asFileTree.files.collect { zipTree(it) } 

    manifest { 
     attributes 'Main-Class': mainClassName 
    } 
} 
相关问题