JavaRush /Java 博客 /Random-ZH /无需 IDE 即可编译并运行 Java
Ve4niY
第 14 级

无需 IDE 即可编译并运行 Java

已在 Random-ZH 群组中发布
有一次在reddit.com上,在没有 IDE 的情况下编译和运行 Java主题中,有人提出了这样的问题:是否有一个命令可以将包内的一组 Java 文件编译到单独的文件夹中(我们称之为bin) ,以及我将如何启动新的类文件?” 不使用 IDE 编译和运行 Java - 1主题作者kylolink解释道:“当我开始使用 Java 时,我依靠 Eclipse 为我完成所有编译工作,只是担心编写代码。”我已经多次看到这个问题,而且确实,这个是什么促使我写博客文章 GPS 系统和 IDE:好还是坏?我喜欢强大的现代 Java IDE,它们让我的日常生活变得更轻松,但是了解如何构建和运行简单的 Java 示例也有好处他们。这篇文章是关于如何做到这一点的。在我关于通过简单测试学习 Java 的博客中,我写了我有时喜欢使用简单的文本编辑器和命令行工具来编写、构建和运行简单的应用程序。我有现在,我很清楚我最喜欢的 Java IDE 需要多少“开销”,并尽早决定使用该框架所获得的好处是否足以证明“开销”的合理性。在大多数实际应用中,毫无疑问VL IDE的价值不菲。然而,对于最简单的示例应用程序来说,情况并非总是如此。本文的其余部分将展示如何在这些情况下在没有 IDE 的情况下构建和运行 Java 代码。

编写和执行 Java 代码

为了使示例更加清晰,我将使用一些非常简单的 Java 类,这些类通过组合或继承相互关联,并且位于名为dustin.examples的同一个包中。两个类缺少一个函数main;第三个类 Main.java 有一个函数main,可让您演示如何在没有 IDE 的情况下运行该类。下面是这三个类的代码: Parent.java
package dustin.examples;

public class Parent
{
   @Override
   public String toString()
   {
      return "I'm the Parent.";
   }
}
孩子.java
package dustin.examples;

public class Child extends Parent
{
   @Override
   public String toString()
   {
      return "I'm the Child.";
   }
}
主程序.java
package dustin.examples;

import static java.lang.System.out;

public class Main
{
   private final Parent parent = new Parent();
   private final Child child = new Child();

   public static void main(final String[] arguments)
   {
      final Main instance = new Main();
      out.println(instance.parent);
      out.println(instance.child);
   }
}
下面的屏幕截图显示了这些.java类的目录结构。该屏幕截图显示源文件位于代表包名称的目录层次结构中(dustin/examples,因为包信息是dustin.examples),并且该包反映了目录层次结构位于子目录 SRC 下。我还创建了一个classes 子目录(当前为空)来存放已编译的.class文件,因此当该目录不存在时Javac不会创建该目录。

使用 JAVAC 构建并使用 Java 运行

无论使用哪种方法创建 Java 代码(Ant、Maven、Gradle 或 IDE),最终都归结为 JAVAC。Oracle/Sun 提供的 JAVAC 命令行工具中的标准选项可以通过运行 JAVAC -help 查看,其他扩展选项可以通过运行 JAVAC -help -X 查看。有关如何使用这些选项的更多详细信息,请参阅适用于 Windows 或 Unix/Linux 的 JAVAC 工具文档。正如 Javac 文档所述,-sourcepath 选项可用于表示源文件所在的目录。在上面的屏幕截图中显示的目录结构中,这意味着,假设我从C:\Java\examples\javacAndJava\ 目录运行 JAVAC 命令,我的命令中必须有类似的内容:Javac -sourcepath src SRC\Dustin\examples\*. 爪哇。以下屏幕截图显示了此操作的结果。 不使用 IDE 编译和运行 Java - 2因为我们没有为.class文件指定目录,所以它们默认放置在与组成它们的源.java文件相同的目录中。我们可以使用该选项-d来解决这种情况。我们的命令现在可以运行,例如Javac -sourcepath src -d classes src\Dustin\examples\*。我你。如前所述,所选文件夹(类)必须已存在。当发生这种情况时,该命令会将.class文件放置在指定的文件夹中,如下图所示。 不使用 IDE 编译和运行 Java - 3将 Java 源文件编译为指定目录中相应的.class文件后,我们可以使用该应用程序的快速启动菜单来启动应用程序Java 命令行工具。只需按照 Java 帮助或 Java 工具页面上提供的说明并使用( 或) 选项指定.class文件的位置即可完成此操作。以下屏幕截图演示了使用这两种方法来指定查找.class文件的类目录。最后一个参数是具有要执行的 main 函数的类的完整(整个 Java 包)名称。以下屏幕截图中演示的命令是 java classes -cpdustin.examples.Main 和 java classes -classpathdustin.examples.Main。 -classpath-cp不使用 IDE 编译和运行 Java - 4

使用 Ant 构建和运行

对于最简单的 Java 应用程序,使用 JAVAC 和 Java 分别创建和运行应用程序是相当容易的,正如刚刚演示的那样。随着应用程序变得更加复杂(例如,代码存在于多个包/目录中,或者第三方库和框架上存在更复杂的依赖类),这种方法可能会变得笨拙。Apache Ant 是“三巨头”Java 构建工具中最古老的,已在数千个应用程序和部署中使用。正如我在之前的博客文章中所说,一个非常简单的 Ant 构建文件很容易创建,特别是如果它以我在这篇文章中概述的模板开始的话。以下代码列表适用于 Ant 的build.xml文件,该文件可用于将.java文件组合为 .class 文件,然后运行dustin.examples.Main类,就像上面使用 JAVAC 和 Java 所做的那样。 构建.xml
<?xml version="1.0" encoding="UTF-8"?>
<project name="BuildingSansIDE" default="run" basedir=".">
   <description>Building Simple Java Applications Without An IDE</description>

   <target name="compile"
           description="Compile the Java code.">
      <javac srcdir="src"
             destdir="classes"
             debug="true"
      includeantruntime="false" />
   </target>

   <target name="run" depends="compile"
           description="Run the Java application.">
      <java classname="dustin.examples.Main" fork="true">
         <classpath>
           <pathelement path="classes"/>
         </classpath>
      </java>
   </target>
</project>
我没有使用 Ant 属性,也没有包含我通常包含的共同目标(例如“pure”和“Javadoc”),以使此示例尽可能简单,并使其与前面使用 JAVAC 和 Java 的示例保持接近。另请注意,我已将 JAVAC Ant 任务的“debug”设置为“true”,因为在 Ant 失败的情况下这不是真的,但在 JAVAC 的默认情况下却是这样。毫不奇怪,Javac 任务和 Java Ant 任务类似于 JAVAC 命令工具和 Java。因为我使用了默认名称 Ant 在未明确指定时需要一个构建文件 (build.xml),并且因为我提供了“Run”目标作为此构建的“默认”,并且因为我将“compile”包含为依赖项运行“Run”目标,并且因为 Ant 位于我的环境路径上,所以我在命令行上所要做的就是让 Ant 编译并运行包含build.xml文件的目录中的 ant 示例。这如下面的屏幕截图所示。 不使用 IDE 编译和运行 Java - 5尽管我已经演示了使用 Ant 编译和运行一个简单的 Java 应用程序,但我倾向于仅使用 Ant 进行编译并使用 Java 运行(或者如果类路径很重,则使用调用 Java 的脚本)。

使用 Maven 构建和运行

尽管 Ant 是第一个核心 Java 构建工具,但 Apache Maven 最终赢得了声誉,很大程度上是因为它采用了基于约定的配置和对共享库存储库的支持。当代码和生成的对象遵循其标准目录布局时,Maven 很容易使用。不幸的是,我的示例没有遵循这个目录结构,但 Maven 确实允许我们覆盖预期的默认目录结构。以下是 Maven POM 文件的代码列表,该文件用于代替源目录和目标目录,并提供使用 Maven 3.2.1 进行 Maven 构建所需的其他最低元素。 pom.xml
<project>
   <modelVersion>4.0.0</modelVersion>
   <groupId>dustin.examples</groupId>
   <artifactId>CompilingAndRunningWithoutIDE</artifactId>
   <version>1</version>

   <build>
      <defaultGoal>compile</defaultGoal>
      <sourceDirectory>src</sourceDirectory>
      <outputDirectory>classes</outputDirectory>
      <finalName>${project.artifactId}-${project.version}</finalName>
   </build>
</project>
由于上面的pom.xml文件定义了“compile”的“defaultGoal”,并且因为pom.xml文件是 Maven 可执行文件(MVN)查找的默认 POM 自定义,并且因为 Maven 安装 bin 目录位于我的路径上,所以仅我需要运行“MVN”来编译 .class 文件,如下面的屏幕截图中所述。 不使用 IDE 编译和运行 Java - 6我还可以使用 Mvn Exec 命令从 Maven 运行已编译的应用程序: Java -Dexec.mainClass =dustin.examples.Main,如以下屏幕截图所示。 在没有 IDE 的情况下编译和运行 Java - 7与 Ant 一样,我倾向于不使用 Maven 来运行简单的 Java 应用程序,而是在已编译的代码上使用 Java(或使用在长时间运行的类上直接调用 Java 的脚本)。

使用 Gradle 构建和运行

Gradle 是三大 Java 构建工具中最新、最流行、最时尚的。我有时对流行的本质持怀疑态度,但我发现 Gradle 有很多值得喜欢的地方(用 Groovy 而不是 XML 编写、内置 Ant 支持、内置 Ivy 支持、按惯例配置很简单)重新配置、Maven 存储库支持等)。以下示例显示了一个 Gradle 构建,可用于编译和运行一个简单的应用程序,这是本文的主要示例代码。我在 Simple Gradle Java Plugin Customization 博客上介绍了这个改编示例。 构建.gradle
apply plugin: 'java'
apply plugin: 'application'

// Redefine where Gradle should expect Java source files (*.java)
sourceSets {
    main {
        java {
            srcDirs 'src'
        }
    }
}

// Redefine where .class files are written
sourceSets.main.output.classesDir = file("classes")

// Specify main class to be executed
mainClassName = "dustin.examples.Main"

defaultTasks 'compileJava', 'run'
build.gradle文件 的前两行指示 Java 插件和应用程序插件的使用,从而导致一系列功能自动构建到此构建中。定义“sourceSets”和“sourceSets.main.output.classesDir”允许您分别覆盖 Gradle 插件的 Java 源代码和编译的二进制类的默认 Java 目录。“MainClassName”允许您显式指定应在应用程序插件。“defaultTasks”行定义了只需在命令行上键入“Gradle”即可运行的任务:“compileJava”是 Java 插件提供的默认任务,“Run”是应用程序插件提供的默认任务。因为我将程序集命名为 build.gradle,这就是为什么我将默认任务指定为“compileJava”和“Run”,并且因为我的路径中有 Gradle 安装 bin 目录,所以构建和运行示例所需要做的就是键入“Gradle”,这在下面的屏幕截图中得到了演示。 不使用 IDE 编译和运行 Java - 8即使是最大的怀疑论者也必须承认,对于这个简单的例子来说,Gradle 构建非常不稳定。它将依赖某些约定和假设的简洁性与在必要时覆盖默认值的非常简单的机制结合起来。事实上它是在 Groovy 中而不是 XML 中,这一点也非常有吸引力!与 Ant 和 Maven 一样,我倾向于仅使用这些工具进行构建,并且倾向于直接从 Java 或调用 Java 的脚本运行已编译的 .class 文件。顺便说一句,我倾向于将这些 .class 归档到 jar 中以供启动,但这超出了本文的范围。

结论

IDE 通常不是构建简单应用程序和示例所必需的,而且可能比构建简单示例的成本还要昂贵。在这种情况下,使用JAVAC和Java直接构建和运行示例是相当容易的。作为更多参与的例子,A​​nt、Maven 或 Gradle 等构建工具变得更有吸引力。事实上,许多开发环境都支持这些构建实用程序,这意味着如果开发人员确定在简单的应用程序成长为成熟的项目时需要 IDE 支持,则可以使用在此过程之前创建的内置工具迁移到 IDE 。
评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION