以编程方式使用java源文件和类文件

以编程方式使用java源文件和类文件,java,compilation,system-console,Java,Compilation,System Console,我将把它分成两个问题,尽可能简洁。不久前,我开始制作一个用于教育目的的文本编辑器,并不断地在其中添加内容。一路上,我决定让它编译和运行java程序。我使用JavaCompiler类进行编译,并使用一个简单的exec()方法在控制台中执行一个命令来运行程序。源代码变得一团糟,可能是因为它是用无组织的随机代码块编写的,所以我最近决定重写它。重写程序时,我在文本区域下方添加了一个控制台窗口,以显示编译器的控制台输出以及运行时抛出的任何异常等 在编写代码以显示JavaCompiler的输出或通过Buff

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

在编写代码以显示
JavaCompiler
的输出或通过
BufferedInputStream
的控制台输出时,我意识到我在做这两件事,我一直认为这两件事的方式非常相似。我的第一个问题主要是问你的意见,我不知道Java中有哪个类会像简单的IDE一样运行Java程序,所以执行控制台命令是我知道的唯一方法,使用javac命令编译代码也可以这样做,我很好奇使用
JavaCompiler
类是否有什么好处

最后,我给这个东西添加了一些简洁的功能。我希望能够跟踪和组织java项目,因为我正在编译和运行java程序。我希望能够告诉任何给定文件属于哪个项目,以及能够告诉项目中的包和目录之间的区别,以便我可以查看包文件夹内部以编译源文件,并从二进制文件夹执行正确的run命令以运行它,Java是否提供了一种方法来实现这一点,或者我是否必须创建从文件继承的自定义类,但有额外的字段来确定文件的类型(目录或包)?还是有更好的方法来实现这一点


谢谢你的时间。

你的两个问题有点齐头并进。让我们从元数据开始。了解如何跟踪IDE的项目元数据的最佳方法是查看已经建立的项目如何尝试这样做

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

你可能想遵循类似的东西,然后考虑添加常见的项目原型,如<>代码> SRC < /C>和<代码> /java类> />代码>或<代码> /Src/main /Java<代码>和<代码> /Test< /Cord>。这就引出了问题的第二部分,编译

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>
注2:

  • “用户的项目名称”由用户在创建项目时提供
  • “default”属性将指向构建文件中的目标
  • “basedir”属性将重新设置生成过程的基础,使其指向项目根目录中的目录,而不是
    .myideproject
    中的目录
  • 接下来,您需要导入
    project.properties
    文件(
    ui.properties
    用于保存与ui相关的数据,而不是用于生成脚本,
    project.properties
    包含生成脚本正常运行所需的所有内容)。以下是将属性导入Ant项目的方式:

    <project ... >
        <import file=".myideproject/project.properties" />
        <!-- ... -->
    </project>
    
    对于上述目标,属性文件可能如下所示:

    <project name="<User's project name>" default="compile" basedir="..">
        <!-- ... -->
    </project>
    
    # 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设置的属性来告诉它主方法使用哪个类
    • <> LI>您可能需要考虑对Maven项目的支持,这有助于用户自动解析依赖关系。这对您来说将是更多的工作,您可能应该等待,直到完成Ant支持
    • 您需要将标准out/err/in从Ant进程重定向到用户可以交互的对象。您不必支持标准输入,但至少应该支持标准输出/err
    根据你的评论最后一句话:你会想
    # 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
    
    + 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>