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

时间:2010-05-16 10:59:59

标签: java syntax

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

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

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

5 个答案:

答案 0 :(得分:6)

名为public的{​​{1}}类必须(在大多数情况下)在名为ClassName的文件中定义。

修改

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

(有关详细信息,请参阅Jon Skeet's answer。)

通过阅读Section 7.2: PackagesThe Java Language Specification, Third Edition可以找到原因。

在本节中,它描述了如何将目录结构映射到Java中的fully-qualified class name,这导致要求包含类的字节码的ClassName.java文件必须位于类似于完全限定类名的路径。

错误地声明命名方案是一项要求的原始答案已经过编辑。

答案 1 :(得分:6)

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

来自section 7.6

  

当包存储在文件中时   系统(第7.2.1节),主机系统可以   选择执行限制   如果是类型,则是编译时错误   在名称下的文件中找不到   由类型名称加上一个组成   扩展名(如.java或.jav)if   以下任何一种情况都属实:

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

这个限制   暗示必须至多有一个   每个编译单元的类型。这个   限制使a容易   用于Java编程的编译器   语言或实施   Java虚拟机找到一个命名   包内的类;例如,   公共类型的源代码   wet.sprocket.Toad会在一个   文件Toad.java在目录中   湿/链轮,和相应的   目标代码可以在文件中找到   Toad.class在同一目录中。

     

将包存储在数据库中时   (§7.2.2),主机系统不得   施加这样的限制。在实践中,   许多程序员选择把每个   类或接口类型   编译单元,无论是否   公共或由代码引用   其他编译单位。

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

答案 2 :(得分:2)

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

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

mvn eclipse:eclipse

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

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

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

答案 3 :(得分:0)

  

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

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

  

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

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

  

如何用eclipse打开maven项目?

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

或者(这是一个独占或者)安装m2eclipse(即Eclipse的一个插件,它扩展了它以使其能够理解Maven项目并与其进行交互。定向方式)和导入... 您的项目为现有Maven项目

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

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

答案 4 :(得分:0)

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

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