Java、Intellij 和 Classpath 之间的关系

问题描述 投票:0回答:1

我正在尝试在 IntelIj 中设置一个项目。我面临一些与 IntelIj 中的项目结构设置相关的问题。虽然我能够修复它。但我仍然很困惑为什么它不能使用默认设置?

通过以下配置,我在配置输出路径时遇到错误。 enter image description here

我面临以下错误:-

enter image description here

为什么会出现这种情况?

为了解决这个问题,我在模块编译器输出路径中选择了另一个选项,并保留默认选项。

enter image description here

虽然解决了上述问题,但却引发了另一个问题 -

ClassNotFoundException

enter image description here

然后为了解决这个问题,我手动添加了编译器输出的路径。 enter image description here

它解决了问题。

我在终端中看到的一个区别是在运行 main 方法时使用了

-classpath
enter image description here

请注意,Java 和 IntelIj 均未安装在

C
驱动器中,而是安装在
D
驱动器中。不知道这是否会导致任何问题。

还有一个问题:- 在我的 IntelIj 中,为什么我需要手动将目录设置为源根目录?

请帮助我理解为什么会发生这种情况。我希望得到详细的解释。 谢谢。

java intellij-idea
1个回答
0
投票

Java 的一般工作方式是将源代码保存到

.java
文件中,然后将其编译为
.class
文件(通常位于与源文件不同的目录中)。

您必须告诉 Java 编译器以及 IntelliJ 源文件的位置(源根目录)以及当源

.java
文件编译为
.class
文件时要使用哪个目录。

虽然这在只有一个模块的 IntelliJ 项目中可能显得多余,但是 IntelliJ 项目通常包含多个模块,并且在模块级别将

.java
源文件和已编译的
.class
文件分开通常是很好的做法,恕我直言。

无论如何,IntelliJ 让您选择,从而产生以下选项:

给定一个具有单个模块的项目:

my-project
  + my-module
    + src
      + com
        + mycompany
          + myproject
            + mymodule
              + Main.java

IntelliJ 允许您指定创建

.class
文件的位置,位于:

  • 项目级别 - 此选项通常不是您想要的,因为所有模块中的所有

    .class
    文件最终都将位于该根目录下(在
    production
    test
    目录中)。例如,指定在项目级别创建
    .class
    文件的位置将导致:

     my-project
       + out 
         + production
           + com 
             + mycompany
               + myproject
                 + mymodule
                   + Main.class
    

    运行如下:

    java -cp my-project/out/production com.mycompany.myproject.mymodule.Main
    
  • 模块级别 - 这通常是您想要的选项,因为

    .class
    文件可以相对于模块存储(尽管这在具有一个模块的项目中可能显得多余,但恕我直言,这仍然是一种很好的做法)。例如,指定在项目级别创建
    .class
    文件的位置将导致:

     my-project
       + my-module 
         + out
           + com 
             + mycompany
               + myproject
                 + mymodule
                   + Main.class
    

    运行如下:

     java -cp my-project/my-module/out com.mycompany.myproject.mymodule.Main
    

本质上,创建模块的原因是隔离代码库的各个部分,因此在模块级别指定输出目录是一个很好的做法。

© www.soinside.com 2019 - 2024. All rights reserved.