在一致的环境中执行Java程序

时间:2013-10-18 06:06:56

标签: java shell ant build command-line-interface

在我工作的地方,我们有一个shell脚本,允许我们使用所有必需的库和设置执行任意Java类,如:

#!/bin/sh
$JAVA_HOME/bin/java -cp LONG_LIST_OF_JARS -Xmx6g -XX:MaxPermSize=128m "$@"

如此使用:

javacorp.sh com.mycorp.SomeJob

这显然比每次都需要明确指定所有java参数要好,但我不喜欢它只是手动连接到Eclipse项目中配​​置的jar来编译代码库。我正在开发一个个人项目,并希望能够从命令行执行任意类,并尝试确定如何最好地提供一致的java环境。

目前我正在使用Eclipse来运行我的应用程序,但我希望能够直接从命令行运行它们,或者在没有安装Eclipse的机器上运行它们。特别是,我还希望能够限制可以执行的类/ jar的范围。例如,javacorp.sh允许我们在src/目录中运行任何内容,只有javacorpunit.sh包含类路径中tests/unit/目录中的类。

  • 是否有一种干净的方法可以使用Ant,Maven或其他一些构建工具在命令行执行配置的java命令,并且只需最少的样板?
  • 有没有办法挂钩Eclipse创建的.classpath文件?这并不能完全解决我的问题(例如一致的内存设置),但使用已经存在的数据会很好。

编辑:

另一种表达我的问题的方法是“在命令行上复制Eclipse的最简单方法是什么?运行当前文件的主方法”按钮?

3 个答案:

答案 0 :(得分:2)

您是否考虑过从Ant生成shell脚本? <pathconvert> task可以从<fileset>创建一个类路径。

您可以为所需的每种shell脚本创建Ant目标。然后,make可以调用这些Ant目标来生成shell脚本。

答案 1 :(得分:1)

我认为你的问题的解决方案是创建一个可执行jar。可以按如下方式运行的东西:

java -jar myapp.jar

“看马,没有类路径”: - )

秘诀是将“Main-Class”和“Class-Path”条目添加到jar的清单文件中。这告诉java要运行什么以及应该将哪些jar加载到类路径中:

<jar destfile="${jar.file}" basedir="${classes.dir}">
    <manifest>
        <attribute name="Main-Class" value="${jar.main.class}" />
        <attribute name="Class-Path" value="${jar.classpath}" />
    </manifest>
</jar>

为了帮助创建类路径,ANT有一个非常有用的manifestclasspath任务:

<manifestclasspath property="jar.classpath" jarfile="${jar.file}">
    <classpath>
        <fileset dir="${dist.dir}/lib" includes="*.jar"/>
    </classpath>
</manifestclasspath>

因此,使用此示例,在运行时,java将期望依赖项驻留在“lib”子目录中(该任务将生成相对链接)。

Eclipse集成很棘手。管理类路径的更好方法是使用像ivy这样的依赖管理器,它有一个Eclipse插件。通过这种方式,ANT和Eclipse都使用相同的机制来控制构建依赖性。

最后,对于一个完整的工作示例,请看一下:

希望这有帮助。

答案 2 :(得分:0)

借助Google的Bazel构建系统,您可以使用java_binary目标轻松定义任意数量的可运行Java程序。您可以定义尽可能多的java_binary个目标,并且它们都可以依赖于java_library目标的相同集合(或重叠集合),因此您不需要手动策划每个二进制文件的类路径。

此外,对于java_binary目标,您还可以生成*_deploy.jar文件,这是一个可以在任何地方运行的独立可执行文件。