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

在一致的环境中执行Java程序,java,shell,ant,build,command-line-interface,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。我正在从事一个个人项目,希

在我工作的地方,我们有一个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在命令行上的“运行当前文件的主方法”按钮最简单的方法是什么?”

您考虑过从Ant生成shell脚本吗?可以从
创建类路径


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

我认为解决问题的方法是创建一个可执行的jar。可以按如下方式运行的内容:

java -jar myapp.jar
“看,妈妈,没有类路径”:-)

秘密在于将“主类”和“类路径”条目添加到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>

任务:


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

Eclipse集成是很棘手的。管理类路径的更好方法是使用类似的依赖关系管理器,它有一个Eclipse插件。这样,ANT和Eclipse都使用相同的机制来控制构建依赖项

最后,要获得完整的工作示例,请查看:

希望这能有所帮助。

借助谷歌的构建系统,您可以轻松地定义任意多个可运行的Java程序,并使用目标。您可以根据需要定义任意多个
java_binary
目标,它们都可以依赖于相同的
java_库
目标集(或重叠集),因此不需要手动管理每个二进制文件的类路径


此外,使用
java\u binary
目标,您还可以生成一个
*\u deploy.jar
文件,这是一个独立的可执行jar文件,您可以在任何地方运行。

好的,至少有一个改进是删除长的\u列表\u个\u jar,并用lib/*.jar替换它。我也不会使用这样的单一通用脚本,既然您正在生成它,为什么不为每个应用程序生成一个合适的脚本(即不指定com.mycorp.MyApplication)。
lib/*.jar
当然更好,但键入它仍然很繁琐,不一定是我想要的(假设有一个库只能由某些工具使用).至于为每个应用程序生成一个合适的脚本,这对于我的用例来说似乎有些过分,除了我要运行的类的名称之外,它们都是完全相同的;此外,我希望最小化创建或运行新类的成本,类似于Eclipse让您点击“播放”的方式一旦你定义了一个main方法,并使用所有配置的jar/设置运行它。我看不到合适的neeed。你想要方便的脚本,尽管你可以点击“Run”在Eclipse中。如果您打算在其他环境中运行它,那么无论如何都应该在这个时候创建一个合适的脚本。似乎只有当您不想启动Eclipse(或者在无头环境中)时,这个脚本才有用?简单的例子,我想将我在Eclipse中编写的Java程序的输出通过管道传输到一个命令,该程序依赖于多个库和设置。这是我(和我的同事)经常需要的,我正在尝试确定是否有一种“好”的方法来实现。然后我仍然必须坚持“编写适当的脚本”解决方案。这不会花很长时间,你只需要做一次。也许你最终会写几乎相同的脚本,但这在现实世界中几乎不是问题。
<manifestclasspath property="jar.classpath" jarfile="${jar.file}">
    <classpath>
        <fileset dir="${dist.dir}/lib" includes="*.jar"/>
    </classpath>
</manifestclasspath>