7

我使用记事本在 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;
4

3 回答 3

5

更新: 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/06/20。

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

于 2016-06-20T20:33:34.663 回答
1

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

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

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

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

于 2013-04-11T09:42:40.200 回答
0

@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);
    }
}
于 2018-10-18T10:44:01.680 回答