3

在我工作的地方,我们有一个 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在命令行上执行配置的命令,并且样板文件最少?
  • 有没有办法挂钩到.classpathEclipse 创建的文件?这并不能完全解决我的问题(例如一致的内存设置),但使用已经存在的数据会很好。

编辑:

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

4

3 回答 3

2

您是否考虑过从 Ant 生成 shell 脚本?该<pathconvert>任务可以从<fileset>.

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

于 2013-10-18T13:41:11.647 回答
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 都使用相同的机制来控制构建依赖关系。

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

希望这可以帮助。

于 2013-10-19T16:28:18.040 回答
0

使用 Google 的Bazel构建系统,您可以轻松定义任意数量的可运行 Java 程序,并使用java_binary目标。您可以根据需要定义任意数量的java_binary目标,并且它们都可以依赖于同一组(或重叠组)java_library目标,因此您无需手动管理每个二进制文件的类路径。

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

于 2015-08-17T20:30:19.277 回答