gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:51:51 25 4
gpt4 key购买 nike

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

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

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

谢谢你的时间。

最佳答案

您遇到的两个问题是齐头并进的。让我们从元数据开始。弄清楚如何为IDE跟踪项目元数据的最佳方法是查看已建立的项目如何尝试做到这一点。

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

您可能希望遵循类似的方法,然后考虑添加常见的项目原型,例如/src/classes/src/main/java/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件事:


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


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

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


这将使用指令 project.properties使 ${propname}中的所有属性可用。现在, srcclassesproject.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设置的属性来告诉它用于main方法的类。
您可能还需要考虑对Maven项目的支持,这可以帮助用户自动解决依赖关系。这将为您带来更多工作,您可能应该等待直到完成Ant支持为止。
您需要将Ant流程中的standard-out / err / in重定向到用户可以与之交互的内容。您不必支持标准输入,但至少应支持标准输出/错误


根据您的评论的最后一句话:您将要使用 JTree与扩展了 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>


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

祝你好运,听起来像是一个有趣的项目。希望我的建议有意义,并可以为您提供帮助。让我知道是否需要澄清。

关于java - 以编程方式使用Java源文件和类文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14323067/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com