如何在Emacs中运行Java代码?

6

我创建了一个项目,并将类名命名为与文件名相同。假设我保存了该项目并想要运行它。我如何通过emacs来实现这一点?我也安装了jdk。


如果你使用Java的IDE,你会按下运行按钮。使用Java的IDE旨在提高生产力,可以显著减少编程、调试、分析和修复代码的时间,这意味着你将能够更快地生成更高质量的代码。建议尝试IntelliJ CE、Netbeans或Eclipse(全部免费)。 - Peter Lawrey
是否考虑使用其他工具?我使用 SCons 来构建Java项目,如果需要运行它们,我只需从Emacs shell中运行即可。曾经有 JDEE 项目,其中包括各种调试器和其他便利功能,但我认为它在多年前已被放弃。除此之外,我认为还有编辑和运行Ant和Maven项目的模式,你可以看一下。 - user797257
@PeterLawrey,你的意思是说Emacs不是一个好的Java文本编辑器吗? - syafihakim
@syafihakim Emacs 或许是 Java 最好的文本编辑器。然而,编写代码远不止于编辑。还有运行、调试、剖析、代码分析修复、重构、智能代码补全、版本控制/合并、所见即所得 GUI 编辑等等... 这是我使用的 http://www.jetbrains.com/idea/features/ - Peter Lawrey
而且,如果我可以补充一下:这也与你最关心的事情有关。除了作为编辑器外,Emacs还可以作为你的shell、文件浏览器、通信工具、时间跟踪器等等。而其他工具通常提供很少或者几乎没有这些任务的工具,只集中在代码编辑特定功能上。我使用Emacs来编写我的Java代码,因为我不写很多Java代码,我迫切需要Emacs所能提供的其他功能;但是,在我曾经工作的环境中,使用Emacs来写Java代码并不真正可行。但有Eclim这个工具。 - user797257
显示剩余2条评论
3个回答

3

我有一些从尝试Java时留下的技巧。

这个技巧适用于由单个文件组成的最简单程序:

(defun java-eval-nofocus ()
  "run current program (that requires no input)"
  (interactive)
  (let* ((source (file-name-nondirectory buffer-file-name))
     (out    (file-name-sans-extension source))
     (class  (concat out ".class")))
    (save-buffer)
    (shell-command (format "rm -f %s && javac %s" class source))
    (if (file-exists-p class)
    (shell-command (format "java %s" out) "*scratch*")
      (progn
    (set (make-local-variable 'compile-command)
         (format "javac %s" source))
    (command-execute 'compile)))))

这是一个关于蚂蚁控制项目的内容:
(defun ant-compile ()
  "Traveling up the path, find build.xml file and run compile"
  (interactive)
  (save-buffer)
  (with-temp-buffer
    (while (and (not (file-exists-p "build.xml"))
        (not (equal "/" default-directory)))
      (cd ".."))
    (set (make-local-variable 'compile-command)
     "ant -emacs")
    (call-interactively 'compile)))

你可能可以在JDEE中找到这些的等效物,如果你能设置好它们(我自己没做到)。

以下是我使用的关键绑定:

(define-key java-mode-map [C-f5] 'java-eval-nofocus)
(define-key java-mode-map [f5] 'ant-compile)

2

2
你需要拥有一款支持启动独立应用程序的emacs版本。接下来,你需要传递启动JVM的命令(例如:java MyClass)。
如果你正在开发一个Web应用程序,你的服务器可能能够在类改变时动态加载 -- 这取决于许多因素。如果你正在这种类型的环境下开发,那么你只需要编译Java代码即可反映在服务器上的更改(假设服务器进行了动态类加载,并且它适用于你的开发环境 -- 我曾经参与过许多无法工作的项目)。

在典型的Java项目中,这并不是您大部分时间要做的事情。很多时候,您会运行一个Java服务器,并轮询某个目录以检测更改,其中更改意味着您已重新编译代码并将新副本放置在那里。另一种处理Java项目的典型方式是使用Maven工具链,它通常可以启动一个或多个Java应用程序,以适应您的项目。 - user797257
嗯,你的启动JVM链接存在一些问题。它只适用于Windows系统(不是Emacs通常使用的系统)。使用裸JVM加载Java类很复杂,而且扩展性非常差。Java命令行API是为Windows用户编写的(他们从不使用命令行API):)所以,如果你想要舒适,那么这种方式更像是受罚,除非你正在编写自己的启动器或类似的东西,否则没有理由走这条路。 - user797257
我认为你假设所有的Java开发都是基于Web的,但实际上并非如此。此外,启动JVM在任何系统上都是相同的,因此链接显示“C:\”或“/usr/home”并不重要。他所问的是如何从emacs运行代码。我将编辑我的答案以扩展不同的环境,但它仍然是一个可行的答案。 - MadConan
你两个方面都错了。有微妙的差别很难一眼看出来。在UNIX平台上,Java PATH使用“:”作为分隔符,而在MS Windows上使用“;”。如果有什么等价物,/usr/home绝不等同于C:,但它相当于XP之后系统上的C:\Users\。两者之间没有同构。如果我想在我的系统上使用你链接中找到的答案,它需要进行重大改写,而我的系统是相当典型的Linux桌面系统。当你面对各种其他部署方案时,天空将是极限 :) - user797257
哇,有675人回复了。样本量很大啊。至少得是百分之二十或三十万分之一吧。 - MadConan
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接