3

假设Java类被打包,文件目录如下:

~/proj/bin/com/example/package/foo.class
~/proj/bin/com/example/package/foo1.class
~/proj/src/com/example/package/foo.java
~/proj/src/com/example/package/foo1.java

类 foo 需要使用类 foo1。在终端中,这是我如何编译

cd ~/proj/bin
javac -d ./ ../src/com/example/package/foo.java

(我已经设置了$CLASSPATH = "~/proj/bin"。似乎这种方式只有在我们 cd 到时才有效~/proj/bin。)

现在使用 vim(我在 Mac 上使用带有 spf13-vim 分布的 vim 插件的 MacVim)。当 .java 文件被 vim 保存时,它会自动使用 javac 编译。但是,vim 将当前文件夹视为~/proj/bin/com/example/package/,而不是~/proj/bin。因此,每当它使用来自 foo1 的类时,它都会在 foo.java 中显示错误。

java类打包时如何在保存时自动编译java?

4

5 回答 5

2

不要忘记 Vim 是一个通用的文本编辑器。尽管您选择的发行版提供的插件提供了快速编译单个文件的功能,但一旦您升级到更大的项目,请为工作选择合适的工具(例如,正确处理依赖项)。

因为这是 Java,所以有很多可用的工具:像AntMaven这样的标准构建工具提供了项目编译所需的所有功能,并且可以在 Vim 中通过:make. 或者,如果您的项目变得更大,切换到功能齐全的 IDE(如EclipseNetBeansIntelliJ IDEA)以从卓越的代码导航和调试功能中获益可能是有意义的。(您仍然可以在它们下面使用 Ant 或 Maven,并在 Vim 中同时编辑文件。)

于 2012-12-11T15:05:01.177 回答
0

我只是偶然找到了解决方案。由于我在 Mac OS X 中使用带有图形界面的 MacVim,所以我~/proj/src/com/example/package/在 finder 中打开文件夹,然后foo.java双击打开文件。我们在 vim 的问候~/proj/src/com/example/package/

要使“保存时编译”工作,只需:cd ~/proj/bin在 vim 中使用命令来通知 vim 做所有事情,就好像我们在~/proj/bin. 现在它只是工作!

顺便说一句,我安装了 spf13-vimrc。

于 2012-12-13T02:09:12.403 回答
0

像这里的其他人一样,我建议使用真正的构建工具而不是 vim hacks。一个不错的 Maven 替代品是sbt(示例使用 Scala,但它同样适用于 Java),它需要较少的设置 - 不需要 POM 文件或类似文件,除非您真的想从 Maven 存储库中提取依赖项。

一切设置好后,您可以启动 sbt,键入~ compile,当检测到文件更改时,它将重新构建您的项目。(同样,您可以~ test在文件更改时重新构建和运行所有测试。)

于 2012-12-12T15:10:05.410 回答
0

我最近遇到了类似的问题,所以这就是我所做的:

我没有让 Vim 在保存时自动编译 Java,而是编写了一个完全执行我想要的编译的脚本,然后我在我的 vimrc 中映射了一个按键,以便在我想要的时候运行那个编译脚本。

因此,例如这里是脚本的一部分(我在 Windows 7 机器上,但它不应该太难适应)

set projectcp=..\classes;..\classes\lib\jackcess-1.2.7.jar;..\classes\lib\commons-logging.jar;..\classes\lib\commons-lang-2.0.jar;..\classes\lib\mail.jar
set compiledir=..\classes

echo Compiling authentication\LDAP_Authenticator.java ...
javac -d %compiledir% authentication\LDAP_Authenticator.java

echo Compiling data\ProgramData.java ...
javac -d %compiledir% data\ProgramData.java

echo Compiling data\Serializer.java ...
javac -cp %projectcp% -d %compiledir% data\Serializer.java

echo Compiling data\EmailEntry.java ...
javac -cp %projectcp% -d %compiledir% data\EmailEntry.java

在我的 vimrc 中,我有这一行,它会自动保存当前文件,然后每次按 rr 时运行我的编译脚本

nnoremap <leader>rr :w<cr>:!compile-and-run.bat<cr>


虽然你的会是:

nnoremap <leader>rr :w<cr>:!PATH/TO/SCRIPT.sh<cr>


或者也许在你必须做的Mac上

nnoremap <leader>rr :w<cr>:!bash PATH/TO/SCRIPT.sh<cr>
于 2012-12-12T14:55:48.853 回答
0

我正在使用 Arch Linux、java17-openjdk,当然还有 Vim。在同一个文件夹中,我有 foo.java 和 Bar.java

// Bar.java
public class Bar {
    String webSite = "Stack Overflow";
}

// foo.java
public class foo {
    public static void main(String[] args) {
        Bar myWebSite = new Bar();
        System.out.println(myWebSite.webSite);
    }
}

在 bash 中,当我运行 java foo.java 时,出现错误:“找不到符号”。正确的方法是编译两个java文件:javac foo.java bar.java,它会生成两个文件.class:foo.class & bar.class。我们只是运行主类所在的新文件,在这种情况下,java foo(没有 .class),bash 将显示:堆栈溢出

于 2022-01-05T06:01:00.807 回答