是否必须在className.java中编写类className?

我正在使用maven构建项目并编译失败,因为我将Test2类放在Test.java

但它是因为maven还是因为java本身不支持这个?

顺便说一句,我怎么能用eclipse打开一个maven项目?

名为ClassNamepublic类必须(在大多数情况下)在名为ClassName.java的文件中定义。

编辑

虽然这不是Java语言的要求,但Java的大多数(如果不是全部)实现都必须保持上面提到的类名和文件名之间的关系,否则将导致编译器错误。

(有关更多信息,请参阅Jon Skeet的答案 。)

可以通过阅读第7.2节: Java语言规范包,第三版来找到原因。

在本节中,它描述了如何将目录结构映射到Java中的完全限定类名 ,这导致要求包含类的字节码的.class文件必须位于类似于完全合格的class级名称。

原始答案错误地表明命名方案是一项要求已被编辑。

Java语言规范本身并不要这样做 – 但它明确允许基于文件系统的实现这样做,而且大多数都这样做。

从第7.6节 :

当包存储在文件系统(第7.2.1节)中时,如果在由类型名称加上名称的文件中找不到类型,主机系统可以选择强制执行编译时错误的限制。如果满足以下任一条件,则为扩展名(例如.java或.jav):

  • 该类型由声明类型的包的其他编译单元中的代码引用。
  • 该类型被声明为public(因此可以从其他包中的代码访问)。

这种限制意味着每个编译单元最多只能有一个这样的类型。 这种限制使得Java编程语言的编译器或Java虚拟机的实现很容易在包中找到命名类; 例如,公共类型wet.sprocket.Toad的源代码可以在wet / sprocket目录中的Toad.java文件中找到,相应的目标代码可以在同一目录中的Toad.class文件中找到。

当包存储在数据库(第7.2.2节)中时,主机系统不得强加此类限制。 在实践中,许多程序员选择将每个类或接口类型放在它自己的编译单元中,无论它是公共的还是由其他编译单元中的代码引用。

出于实际目的,我认为基本上假设它是必需的是合理的。

Java要求您将公共类放在具有相同名称的文件中。

对于eclipse和maven使用sonatype m2插件。 在您的maven项目中,您可以输入

 mvn eclipse:eclipse 

和maven将为您创建.project.classpath文件。 这些是eclipse与项目一起工作所需的文件。

您必须使用本地maven存储库的路径定义eclipse类路径变量M2_REPO

使用sonatype m2你可以在eclipse中做maven的事情:添加依赖项,运行maven目标,……

文件名和类名之间的连接如下:

  • 如果文件中有public class ,则文件名必须与类名相同
  • 您可以在具有不同名称的文件中拥有任意数量的非公共类

我正在使用maven构建项目并编译失败,因为我将Test2类放在Test.java中,

源文件必须以它们包含的公共类命名,并附加后缀.java 。 在这种情况下,公共类Test2的源文件必须是Test2.java 1

是因为maven还是因为java本身不支持这个?

Java编译器javac正在抱怨,而不是Maven(Maven不会改变编译器的行为)。

我怎么能用eclipse打开一个maven项目?

要么使用Maven Eclipse插件 (即Maven的插件),只需在项目中运行mvn eclipse:eclipse ,然后在Eclipse中将其作为现有项目导入到Workspace中。 您需要设置指向本地存储库的类路径变量M2_REPO才能使用它。 查看“ 使用情况”页面了解详细信息

或者(这是一个独家或者)安装m2eclipse (即Eclipse的插件,扩展它以使其能够理解Maven项目并以双向方式与之交互)并导入…您的项目作为现有Maven项目

如果EXCLUSIVE不够清楚,这意味着:使用一个另一个但不能同时使用两个。

1如Jon Skeet所述,JLS 允许对基于文件的实现进行此限制。 当使用数据库存储Java构造(如Visual Age for Java正在执行)时,这不适用。 但在你的情况下,确实如此。