1

为了尽可能简洁,我将把它分成两个问题。前段时间我开始制作一个用于教育目的的文本编辑器,并且一直在这里和那里添加。在此过程中,我决定希望它编译和运行 java 程序。我使用JavaCompiler类来编译和一个简单的exec()方法来执行命令以在控制台中运行程序。源代码变得一团糟,可能是因为它是用无组织的随机代码块编写的,所以我最近决定重写它。在重写程序时,我在文本区域下方添加了一个控制台窗口,以显示编译器的控制台输出以及运行时引发的任何异常等。

在编写代码以通过JavaCompilera 显示来自或控制台输出的输出时,BufferedInputStream我意识到我正在做这两件事,我一直认为它们以非常不同的方式相似。我的第一个问题主要是问你的意见,我不知道 Java 中有一个类会像简单的 IDE 一样运行 java 程序,所以执行控制台命令是我知道的唯一方法,同样可能是完成使用 javac 命令编译代码,我很好奇使用JavaCompiler该类是否有任何优势?

最后,我一直在为这个东西添加一些简洁的功能。我希望能够跟踪和组织 java 项目,因为我正在编译和运行 java 程序。我希望能够知道任何给定文件属于哪个项目,以及能够区分项目中的包和目录,以便我可以查看包文件夹以编译源文件并执行正确的运行命令从二进制文件夹中运行它,Java 是否提供了一种方法来执行此操作,还是我将不得不做一些事情,例如创建从文件继承但具有附加字段来确定文件类型(目录或包)的自定义类?还是有更好的方法来实现这一点?

谢谢你的时间。

4

1 回答 1

1

你提出的两个问题是齐头并进的。让我们从元数据开始。弄清楚如何跟踪 IDE 的项目元数据的最佳方法是查看已建立的项目如何尝试执行此操作。

Eclipse 和 Netbeans 都使用在项目根目录中创建的项目文件夹来保存元数据(.settings在 Eclipse 中,.nbproject在 Netbeans 中)。源文件夹、编译器目标目录、源级别等元数据保存在元数据文件中,主要是 XML。

您可能想要遵循类似的内容,然后考虑添加常见的项目原型,例如/srcand/classes/src/main/javaand /target。这导致您的问题的第二部分,编译。

Netbeans 本身并不直接使用编译器。Eclipse 可以,但那是因为 Eclipse 有自己的内部编译器实现来提供默认编译器中不可用的额外警告和配置。对于您的 IDE,我将看看 Netbeans 如何管理其项目并对其进行编译。Netbeans没有调用javac,而是使用 Ant 和一个内部build.xml文件。如果您不熟悉 Ant,它只是一个工具,允许您在 XML 中设置由 Ant 解释和运行的任务。例如,您可以使用 Ant 编译 Java 源代码、生成文档和创建分发 JAR。这是一个非常强大的工具,可让您将整个构建过程作为一种脚本自动化。

你可以遵循同样的想法。IDE 中的新项目将有一个默认build.xml文件,该文件将使用一些默认的 Ant 目标构建他们的项目。您也可以从中访问属性文件build.xml,因此您可以在属性文件中存储有关源目录的信息,以及要在构建脚本中使用的任何其他可定制信息,并将它们导入构建脚本中。这是一个示例设置。

文件结构:

| Project root/
|   .myideproject/
|     build.xml
|     project.properties
|     ui.properties
|   classes/
|     <compiled .class files>
|   doc/
|     <generated javadoc files>
|   lib/
|     <3rd-party .jar files needed for compilation>
|   src/
|     <user .java files>

build.xml文件是您的 IDE 用来编译内容的文件。您可以要求用户安装 Ant(一个快速而轻松的过程),也可以像 Netbeans 那样捆绑它(为您做更多的工作)。在任何一种情况下,如果你将你的嵌套build.xml.myideproject目录中,你的构建文件将如下所示:

<project name="<User's project name>" default="compile" basedir="..">
    <!-- ... -->
</project>

注意2点:

  1. “用户的项目名称”由用户在创建项目时提供。
  2. “默认”属性将指向构建文件中的目标。
  3. “basedir”属性将重新构建构建过程,使其指向项目根目录中的目录,而不是.myideproject.

接下来,您需要导入project.properties文件(ui.properties用于保存与 UI 相关的数据,而不是用于构建脚本,project.properties包含构建脚本正常运行所需的所有内容)。这是将属性导入 Ant 项目的方式:

<project ... >
    <import file=".myideproject/project.properties" />
    <!-- ... -->
</project>

这将使用指令使所有属性project.properties可用${propname}。现在,srcclasses是文件中的可配置目录project.properties,我们可以在compile目标中使用它们,如下所示:

<target name="compile">
    <javac srcdir="${src}"
        destdir="${target}"
        classpath="${classpath}"
        source="${src.jdk}"
        target="${target.jdk}"
        debug="on"
        debugLevel="lines,vars,source" />
</target>

对于上述目标,属性文件可能如下所示:

# delimits source directories containing .java files using ':'
src=src1:src2
# only 1 directory, it's where the .class files go
target=classes
# ':'-delimited list of jars or globs which are needed for compilation
classpath=lib/*
# Determines the -source value on the javac process
src.jdk=1.6
# Determines the -target value on the javac process
target.jdk=1.6

评论只是为了清楚起见。此属性文件将使用用户输入从您的 IDE 的 UI 构建,因此如果他们添加或删除源文件夹,src属性文件中的值会自动更改,然后他们可以重建该过程。

这应该足以让你开始。需要考虑的一些事项:

  • 您将需要一个run使用java任务的目标以及 IDE 设置的属性来告诉它哪个类用于主方法。
  • 您可能还需要考虑对 Maven 项目的支持,它可以帮助用户自动解决依赖关系。这对你来说是更多的工作,你可能应该等到你完成 Ant 支持
  • 您需要将标准输出/错误/输入从 Ant 进程重定向到用户可以与之交互的东西。您不必支持标准输入,但您至少应该支持标准输出/错误

根据您的评论的最后一句话:您需要将 aJTree与扩展的自定义节点类一起使用DefaultMutableTreeNode以创建视图,但它不必是文件结构的视图,而只是项目的视图,所以也许它可能是这样的:

+ Project 1 Name
| + Source Folder 1
|     <.java files>
| + Source Folder 2
|     <.java files>
| + Source Folder 3
|     <.java files>
+ Project 2 Name
| + Source Folder 1
|     <.java files>
| + Source Folder 2
|     <.java files>
| + Source Folder 3
|     <.java files>

该结构可以基于文件系统,但只显示用户需要的信息,例如他的源目录。你可以从那里扩展这个想法。

祝你好运,听起来是个有趣的项目。希望我的建议有一定的意义,可以帮助你。让我知道是否有任何需要澄清的地方。

于 2013-01-15T20:02:40.373 回答