Java大小写敏感性:类文件冲突:存在具有不同大小写的资源

时间:2014-09-12 14:36:37

标签: java eclipse

我在Windows操作系统中,在eclipse IDE中工作,我有以下两种情况:

1。我创建了下面的类,这是在Employee.java类中(E是大写的):

public class Employee {
    public static void main(String[] args) {
        employee emp = new employee();
        emp.test();
    }
}

//here e is in lowercase
class employee {
    public void test() {
        System.out.println("I am in test()");
    }
}

在这种情况下,我得到了以下例外:

Exception in thread "main" java.lang.NoClassDefFoundError: employee (wrong name: Employee)
    at java.lang.ClassLoader.defineClass1(Native Method)
    at java.lang.ClassLoader.defineClass(Unknown Source)
.
.
.
at Employee.main(Employee.java:4) // i.e at emp.test();

2。我创建了下面的类,这是Employee.java类:

public class Employee {
    public static void main(String[] args) {

    }
}

现在,当我尝试在同一个包中创建employee.java(e是小写)类时,我在eclipse中收到了 Type with same name but different case exists.

的消息

我的问题是:Java区分大小写。这是否意味着JVM(基于Windows和UNIX)区分大小写或编译器区分大小写?为什么它在场景1和eclipse中给出了异常,这使我无法在场景2中的相同位置创建employee.java文件。

还记得我在Windows操作系统上对文件名不区分大小写,所以我知道它不允许在同一位置使用employee.java和Employee.java。 这是否违反了Java区分大小写?

5 个答案:

答案 0 :(得分:2)

Windows上的文件系统不区分大小写:Employee.class和employee.class不能驻留在同一目录中。

场景1,在同一个java源中定义了两个类: 创建employee.class的编译器可能会过分使用Employee.class或其他任何内容。

具有单独Java源的场景2: Eclipse无法在Employee.java(在Windows文件系统下)的同一目录中创建employee.java。因此,过去有人负责处理用户友好的错误。

Java假定区分大小写的名称。

您可以将您的资源转换为Linux,将它们编译为.jar(zip格式,同样区分大小写)。然后将jar复制到windows并执行它。

顺便说一下,我认为你找到了一种新的方法来混淆java源代码,在Windows下进行反编译。


相关主题是在类/文件名中使用Unicode字母。它涉及不同的平台,Unicode的不同规范表示(é作为一个或两个Unicode代码点),版本控制系统。

详细说明: (感兴趣的)

人物角色é在Unicode中有两个表示形式:

  • “\ u00E9” - 作为一个代码点U + 00E9,é;
  • “e \ u0301” - 作为两个代码点,U + 009B,字母e,再加上变音符号U-0301,´(零宽度重音)。

不幸的是,不同的操作系统(我被告知)使用不同的规范表示。 我曾经想使用版本控制系统 hg ,但必须找出他们缺少对Linux / Windows互操作性的支持。

否则,可以使用java.text.Normalizer将规范化规范化为规范形式。

所以让我们等待:

class CaféMañanaFaçade

答案 1 :(得分:1)

这不是Java的限制,而是您尝试编写文件的Windows文件系统的限制。在不区分大小写的文件系统上,编译器无法将Employee.classemployee.class写入磁盘,因为就FS而言,它们是同一个文件。

如果您可以以某种方式编译到区分大小写的文件系统(例如在Linux上),然后将生成的类文件打包到JAR中,那么您将能够在Windows上从该JAR运行而不会出现错误,如ZIP文件 能够包含两个不同的条目,其名称仅在大小写上有所不同。

答案 2 :(得分:0)

无论如何,按照惯例,类名应始终以大写字母开头。

此约定有助于避免您所描述的问题。

答案 3 :(得分:0)

不,它没有; Java区分大小写,并且所有Java都可以控制自身。

它无法控制您的文件系统,其实现可能不遵守Java策略。

答案 4 :(得分:0)

我在gradle项目中遇到了这个问题,该项目包含多个子项目,来源不同。他们中的一个有一个读com.package.level1.Main的类,另一个有com.package.level1.main.Util。当我为整个项目运行gradle build时,它在命令行中运行良好,但是Eclipse项目上的红色惊叹号很难解决。消除此问题的方法是删除该项目的源文件的自动Java编译,并设置为仅使用gradle。情况如下:

  1. 转到Project Properties
  2. 从左侧窗格中选择Builders
  3. 取消选择Java Builder,仅保留Gradle Project Builder
  4. 应用并关闭属性。
  5. 从工作区中删除项目。删除时,选择不从文件系统删除文件的选项。
  6. 将项目导入回Eclipse,您应该已完成。