在我工作的地方,我们有一个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/
目录中的类。
java
命令,并且只需最少的样板?.classpath
文件?这并不能完全解决我的问题(例如一致的内存设置),但使用已经存在的数据会很好。编辑:
另一种表达我的问题的方法是“在命令行上复制Eclipse的最简单方法是什么?运行当前文件的主方法”按钮?
答案 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
文件,这是一个可以在任何地方运行的独立可执行文件。