如何将多个Java文件编译在一起?

时间:2021-08-01 16:40:37

标签: java class intellij-idea

我在弄清楚如何在 intellij IDEA 中运行程序时遇到问题。我是 Java 新手,来自 C++。

我按照教程创建了 Snake 游戏(在不同的 IDE 中完成)。我有 3 个文件 GamePanel.java、GameFrame.java 和 SnakeGame.java(这个文件有主文件)。我试过搜索如何编译多个文件,我发现一篇文章说要运行

java *.java

但后来我遇到了找不到 main 的问题。

Error from the terminal code

如果我只是点击构建项目图标,它会说构建完成但游戏没有弹出。

我发现让游戏弹出的唯一方法是将所有类放在一个文件中,然后在终端中运行。

java filename.java

我的问题是为什么按 build project 时游戏不显示?

2 个答案:

答案 0 :(得分:1)

javac 工具(编译)与 java 工具(执行)

要通过命令行编译,请使用 javac 而不是 java。请参阅documentation for javac

java 工具用于运行已编译的类。对于多个类,您应该将它们放入一个 Java ARchive file (JAR) 文件中。您包含一个清单文件,用于确定哪个类具有用于启动的 main 方法。

正如您所发现的,Java 11 获得了一个便利的特性,即可以通过简单地调用 java 来编译和执行带有 main 方法的单个源代码文件。javac 工具是代表您隐式调用的。见JEP 330: Launch Single-File Source-Code Programs

IDE

仅供参考,大多数情况下使用 IDE 为我们进行编译和打包,而不是手动调用命令行工具。我建议你也这样做。

您可以选择至少三个非常好的 IDE,每个都具有广泛的功能。此处以随机顺序列出:

这三款产品均免费提供,JetBrains 除了免费的社区版本外,还提供付费的Ultimate 版本。

这三个工具都支持使用 Apache Maven 或 Apache Gradle 作为依赖项管理和构建自动化工具。因此,您可以选择让您的项目跨 IDE 移植。

IntelliJ 示例

这是在 Apache Maven 中使用 IntelliJ 的快速教程。

选择文件 > 新建 > 项目。在“新建项目”对话框中,单击左侧的 Maven。选中从原型创建。向下滚动到 org.apache.maven.archetypes:maven-archetype-quickstart。展开该项目以选择 RELEASE。点击下一步按钮。

将您的项目命名为 MyFirstDemo。这是在磁盘上创建的项目文件夹的名称。展开工件坐标。将 GroupId 更改为适合您的内容,例如 com.esau.demo。约定是使用您拥有的真实域的反向,或者发明一些不太可能导致命名冲突的东西。将 ArtifactId 更改为我们最终将生成的 .jar 文件的名称。也许只是“MyFirstDemo”,但如果您愿意,它可以与项目名称不同。

点击下一步到 Maven 屏幕。 IntelliJ 附带了 Apache Maven 的副本。没有变化,点击下一步

等待您的项目创建完成。这可能需要一些时间,因为 Maven POM(配置)文件通常会扩展自身,然后创建项目,并下载所需的库。

编辑您的 POM。我建议改变:

    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>

... 到您想要的 Java 版本。 Java 16 是最新的。我正在为 Apple Silicon 机器使用 Java 17 的早期访问版本。所以我使用:

    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>

您会看到一个厘米见方的小浮动窗口,上面有一个“M”小图标,上面覆盖着一个小双箭头圆圈。单击它并应用您的 Maven POM 编辑。等一下。

四处寻找并单击 IntelliJ 窗口左侧、按钮或右侧的“Maven”选项卡。如果没有,请单击最左下角的弹出菜单。无论哪种方式,您都应该获得一个 Maven 面板,其中列出了您的项目名称。展开它,然后展开出现的 Lifecycle。在列出的几个动词中,注意cleaninstall。双击其中的每一个,在中间等待片刻。您可能需要等待更多内容下载。现在您的应用程序已准备好运行。关闭 POM 文件。

Project 窗格中,通过您的项目名称导航到 src 文件夹,通过 main 等等,直到您到达 App 。双击在编辑器中打开。

您将看到一个简短的课程,其关键行是:

public static void main( String[] args )
{
    System.out.println( "Hello World!" );
}

您应该会在该 main 方法的左侧看到一个绿色三角形图标。单击该图标可显示多个运行调试 项的弹出菜单。选择第一个 run 项目。您应该会看到 运行 窗格出现,显示结果。

让我们添加一个文件。在 Project 窗格中,右键单击 com.esau.demo 包名称。选择新建 Java 类。在出现的小窗口中,选择 Record(对于 Java 16 或更高版本)。在同一个框中,输入 Person,然后按 Return/Enter。

如果不熟悉记录,请参阅JEP 395: Records。记录是编写类的一种简短方式,其主要目的是透明和不可变地通信数据。您只需要声明成员字段的名称和类型。编译器隐式创建构造函数、getter、equals & hashCodetoString

创建并打开一个 Person.java 文件。编辑成这样:

package com.esau.demo;

import java.time.LocalDate;

public record Person ( String name , LocalDate hired ) { }

翻回 App.java 标签。编辑成这样:

package com.esau.demo;

import java.time.LocalDate;
import java.time.Month;

/**
 * Hello world!
 */
public class App {
    public static void main ( String[] args ) {
        System.out.println( "Hello World!" );
        Person alice = new Person( "Alice" , LocalDate.of( 2020 , Month.MARCH , 23 ) );
        System.out.println( "alice = " + alice );
    }
}

再次单击 main 方法上的绿色三角形图标。这将导致您的代码更改被保存、编译和执行。

screenshot of code editor with green-triangle icon to run app

Run 窗格显示:

<块引用>

世界你好!

alice = Person[name=Alice,hired=2020-03-23]

如果一切正常,去发现您自动构建的 .jar 文件。在 Project 窗格中,导航到 target 文件夹。展开以查看 MyFirstDemo-1.0-SNAPSHOT.jar。右键单击以选择打开方式 > Finder(对于 macOS — 选择适合您的操作系统的操作系统文件管理器工具,例如 BSD、Linux、Windows 等)。< /p>

为了好玩,让我们探索一下您的 .jar 文件。 JAR 实际上只是一个 ZIP file。所以用解压工具打开。在 Mac 上,将名称更改为以 .zip 结尾:MyFirstDemo-1.0-SNAPSHOT.zip,然后双击以展开一个名为 MyFirstDemo-1.0-SNAPSHOT 的新文件夹。从那里,仔细查看 MANIFEST.MF 文件和您编译的类。完成后,删除整个 target 文件夹,因为 IntelliJ 将在您的下一次构建中重新创建它。

screenshot of folders leading to manifest file

screenshot of folders leading to pair of class files

之后,您的家庭作业就是学习 IntelliJ 的 Run/debug configurations 文档。

答案 1 :(得分:1)

替换

java *.java

javac *.java

javac 是编译 .java 文件的命令,由于您想将其应用于所有文件,因此指定 *.java

javac *.java 编译该文件夹中的所有 java 文件。为了运行带有 public static void main 的文件,您需要使用 java Foo,其中 Foo.java 是具有 public static void main 的文件。

演示:

[~/Desktop/quickstart]: ls
A.java  B.java  C.java
[~/Desktop/quickstart]: javac *.java
[~/Desktop/quickstart]: ls
A.class A.java  B.class B.java  C.class C.java
[~/Desktop/quickstart]: java C
Hello
Hi

A.java:

class A {
    public void hello() {
        System.out.println("Hello");        
    }
}

B.java:

class B {
    public void hi() {
        System.out.println("Hi");       
    }
}

C.java:

class C {
    public static void main(String[] args) {
        A a = new A();
        a.hello();

        B b = new B();
        b.hi();
    }
}