【问题标题】:Compile and execute java via bash shell通过 bash shell 编译并执行 java
【发布时间】:2014-02-19 06:07:31
【问题描述】:

我正在尝试编写一个 shell 代码来执行我的 Java 程序。我试过这个:

#!/bin/sh
COMPILECMD="javac server.jar"
RUNCMD="java -jar server.jar 12777"

$COMPILECMD
$RUNCMD

但是我收到了这个错误:

错误:类名“server.jar”仅在注释时才被接受 显式请求处理 1 错误加载主类失败 server.jar 中的 manifest 属性

在命令行中我不使用jar文件,我只是编译然后执行:

javac server.java 
java server 12777

【问题讨论】:

  • javac 将 Java 源文件编译为类文件 - 它不会创建 Jar。为此,您还需要使用jar 命令(并配置主类是什么,以便它可以创建适当的清单)。但是,您可能想考虑使用 ant 或 maven 来执行类文件的编译和 jarring。
  • 既然你知道命令行的工作原理,你为什么要在 shell 脚本中做一些不同的事情呢?正如 Greg 所说,如果您想构建一个 jarfile,您可以这样做,但您需要使用正确的命令序列来执行此操作,并且如果您希望 server 成为您需要的 jar 的默认 main() 类还要创建一个清单文件。
  • offtopic 评论,但"shell code" 有不同的含义。 :-) 您在此处编写的内容通常称为“shell 脚本”或“shell 程序”,尽管术语并没有那么明显。

标签: java linux bash shell jar


【解决方案1】:

将 Java 程序从 shell 构建到 JAR 文件的典型方法是使用 ant 实用程序。

它的主页(和文档)在这里:http://ant.apache.org/

基本上,您会在项目文件夹中编写(或使用工具编写)build.xml,然后运行 ​​ant 进行编译、捆绑等。

(免责声明:我不是 Ant 的粉丝,但我相信它是 Java 世界中用于此任务的最常见/最受欢迎的工具。 )


如果您熟悉传统的 Unix Makefile,您也可以使用它们。一些规则如:

     CLASSES= Server.class Supporting.class

     %.class:   %.java
           javac $<

     %.jar:  $(CLASSES) Manifest.mf
           jar cfm $@ Manifest.mf $(CLASSES)

您也可以使用直接的 shell 脚本:

      javac Server.java
      javac Supporting.java
      jar cfm Server.jar Manifest.mf Server.class Supporting.class

但是,如果您的项目超过了几个文件,那么维护它可能会成为一场噩梦。


还有其他可用的工具,但这些是我所知道的最典型的。

【讨论】:

    【解决方案2】:

    我认为你理解错误。 jar 是由 jar 命令而不是 javac 命令创建的。

    jar 命令创建一个jar文件(zip文件包含里面的所有类) javac 命令只编译和转换 .java 到 .class 而已

    编译命令示例:

    javac server.java; jar cvf server.jar server.class
    

    您可能会发现以下链接有所帮助。 http://docs.oracle.com/javase/tutorial/deployment/jar/build.html

    【讨论】:

      猜你喜欢
      • 2019-05-16
      • 1970-01-01
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 2014-01-28
      相关资源
      最近更新 更多