我在弄清楚如何在 intellij IDEA 中运行程序时遇到问题。我是 Java 新手,来自 C++。
我按照教程创建了 Snake 游戏(在不同的 IDE 中完成)。我有 3 个文件 GamePanel.java、GameFrame.java 和 SnakeGame.java(这个文件有主文件)。我试过搜索如何编译多个文件,我发现一篇文章说要运行
java *.java
但后来我遇到了找不到 main 的问题。
如果我只是点击构建项目图标,它会说构建完成但游戏没有弹出。
我发现让游戏弹出的唯一方法是将所有类放在一个文件中,然后在终端中运行。
java filename.java
我的问题是为什么按 build project 时游戏不显示?
答案 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,每个都具有广泛的功能。此处以随机顺序列出:
这三款产品均免费提供,JetBrains 除了免费的社区版本外,还提供付费的Ultimate 版本。
这三个工具都支持使用 Apache Maven 或 Apache Gradle 作为依赖项管理和构建自动化工具。因此,您可以选择让您的项目跨 IDE 移植。
这是在 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。在列出的几个动词中,注意clean 和install。双击其中的每一个,在中间等待片刻。您可能需要等待更多内容下载。现在您的应用程序已准备好运行。关闭 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
& hashCode
和 toString
。
创建并打开一个 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
方法上的绿色三角形图标。这将导致您的代码更改被保存、编译和执行。
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 将在您的下一次构建中重新创建它。
之后,您的家庭作业就是学习 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();
}
}