【问题标题】:Console command to do Java auto-import用于执行 Java 自动导入的控制台命令
【发布时间】:2013-01-03 12:48:47
【问题描述】:

我使用记事本在 Java 中进行开发。 我对开发周期非常满意,但我缺少 Eclipse 和其他大型 IDE 所具有的自动导入功能。 我的猜测是:如果 Eclipse 做到了,那么有一个外部工具可以做到这一点。

我可以安装这样的工具并从命令行使用它吗?

例如我有这个源代码:

public class Test extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final TextView tv = new TextView(this);
        tv.setText("Hello World!");
        setContentView(tv);
    }
}

我想运行一些这样的实用程序:

jautoimp Test.java

并得到这个输出:

import android.app.Activity;
import android.os.Bundle;
import android.widget.TextView;

【问题讨论】:

  • 你为什么不用像Eclipse with ADT plugin这样的IDE?
  • 我不使用 Eclipse,因为我不喜欢它。我喜欢记事本和命令行工具。
  • Vim 用户在这里寻找同样的实用程序...
  • @GregPrisament,您可以查看eclim。不可能称它为 CLI 工具,但这也是强大的解决方案。
  • @GregPrisament:以下两种可能性

标签: java autocomplete console-application notepad++


【解决方案1】:

更新:serv-inc 已经创建了这个程序的一个版本,它可以自动确定您需要导入的类(而不必自己手动指定它们)。

用法:./javimp.py <java-src-file> [<java-src-file> ...]

仅支持插入模式(意味着文件本身将被更改)。这个工具可能更接近大多数想要命令行自动导入工具的人正在寻找的东西。


我今天也在找同样的东西,但没找到。不过,我今天大部分时间都在制作一个能够执行类似操作的 Python 脚本。

javimp.py 通过 CLI 工作。它有几种不同的模式,但在您的情况下,-i 选项可能是您想要的。

python javimp.py -i YourJavaFile.java

运行此命令将使 javimp.py 通过 YourJavaFile.java 寻找以“import”开头的行。当它找到一个时,它将尝试将行的其余部分与由网络抓取创建的 Java 类数据库中的条目的结尾进行匹配,如果找到匹配项,它将用import full.package.to.WhateverClassYouHadImported; 替换该行。它还会考虑缺少(甚至太多)分号。

在您的示例中,这将是:

// Note that you still need to import the classes, but
// you don't need to remember the packages in your head
// anymore

import Activity; // -> import android.app.Activity;
import Bundle;   // -> import android.os.Bundle;
import TextView; // -> import android.widget.TextView;

public class Test extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final TextView tv = new TextView(this);
        tv.setText("Hello World!");
        setContentView(tv);
    }
}

这种方法并不完美 - 值得注意的是,如果数据库中某处有两个具有相同名称的类,则可能会得到错误的匹配,并且它还需要一个涵盖所有领域的最新数据库发展。但是,只要您不太信任它,它可能是一个有用的工具。您还可以编辑源代码以将网络抓取扩展到其他网页,而不是我在快速混杂解决方案中指定的网页。开箱即用,它应该支持 Java 标准库和 Android API,截至 2016 年 6 月 20 日。

请记住,如果您没有使 javimp.py 可以从文件系统中的任何位置访问,那么如果您从它所在目录之外的其他位置运行它,您仍然需要指定它的路径。就个人而言,我通过向我的编辑器添加一个命令来规避这个问题,该命令通过指定绝对路径在活动文件上运行它。你可能会做类似的事情。

【讨论】:

    【解决方案2】:

    @winterweird 的回答似乎不错。 https://github.com/serv-inc/javimp 的代码扩展了他的自动添加 javac 说它需要的导入。它缺少除-i 之外的所有其他模式。你可以称它为

    python javaimp.py JavaFile.java
    

    或者,更新类列表,如python javimp.py。您需要文件javimp.py,并且需要为当前班级列表运行一次,或者还需要下载文件java_classes.list

    PS: 结果文件是

    import android.widget.TextView;
    import android.os.Bundle;
    import android.app.Activity;
    public class Test extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            final TextView tv = new TextView(this);
            tv.setText("Hello World!");
            setContentView(tv);
        }
    }
    

    【讨论】:

      【解决方案3】:

      现代 IDE 可以自动完成的主要原因是它们对您的整个项目有深入的了解。即使没有单独的编译步骤,良好的自动完成功能也可以工作。

      这意味着编辑器和编译器是非常好朋友,因此编译器会在编辑文件时处理文件(而不是编译所有内容),并且编辑器知道编译器派生的内容来自您的来源。

      在 Unix 世界中,这通常称为 TAGS,有两种方言 - 一种用于 vi,一种用于 emacs。在我看来,你最好的选择是切换到这些编辑器之一,然后根据需要手动生成 TAGS 文件。曾尝试在 Emacs(Java EE 项目)中编写更完整的 Java 编程环境,但 Eclipse 因无法进行重构而终止了它。

      请注意,您要求的功能实际上是 IDE 的特性之一。您可能需要考虑是否准备好使用更多的 IDE 功能,而不仅仅是自动完成。

      【讨论】:

        猜你喜欢
        • 2016-05-20
        • 1970-01-01
        • 2014-09-07
        • 2016-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-08
        • 2012-10-13
        相关资源
        最近更新 更多