Java区分大小写:类文件冲突:存在具有不同大小写的资源

Java区分大小写:类文件冲突:存在具有不同大小写的资源,java,eclipse,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

我在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()");
    }
}
public class Employee {
    public static void main(String[] args) {

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

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 emp = new employee();
        emp.test();
    }
}

//here e is in lowercase
class employee {
    public void test() {
        System.out.println("I am in test()");
    }
}
public class Employee {
    public static void main(String[] args) {

    }
}
现在,当我试图在同一个包中创建employee.java(e是小写)类时,我在eclipse中得到一条消息,即存在同名但大小写不同的类型。

我的问题是:Java是区分大小写的。这是指JVM(基于windows和UNIX)区分大小写还是编译器区分大小写?为什么它在场景1中给出了这个异常,而eclipse不允许我在场景2中的相同位置创建employee.java文件


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

无论如何,按照惯例,类名应该总是以大写开头


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

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


如果你能以某种方式编译一个区分大小写的文件系统(例如在Linux上),然后将生成的类文件打包到一个JAR中,那么你就能够在Windows上从这个JAR中运行而不会出错,因为ZIP文件能够包含两个不同的条目,它们的名称只大小写不同。

不,它不能;Java是区分大小写的,这就是Java所能控制的——它自己


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

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

我在一个gradle项目中遇到了这个问题,该项目包含多个儿童项目,并且来源不同。其中一个类的名称为
com.package.level1.Main
,另一个类的名称为
com.package.level1.Main.Util
。当我为整个项目运行GradleBuild时,它在命令行中运行得很好,但是Eclipse项目上的红色感叹号很难解决。如何摆脱这种情况是删除项目源文件的自动Java编译并设置为仅使用gradle。这是怎么回事:

  • 转到
    项目属性
  • 从左窗格中选择
    Builders
  • 取消选择
    javabuilder
    ,只保留
    gradleprojectbuilder
  • 应用并关闭属性
  • 从工作区中删除项目。删除时,选择不从文件系统中删除文件的选项
  • 将项目导入回Eclipse,您就应该完成了

  • Java是区分大小写的,但您的文件系统并不总是如此。试着在linux中做同样的事情。是similar@greg-你说得对。标记为dupBuddy我知道转换,但这不是关于转换,我的问题是,Java还允许我们以小写创建类。但只创建了一个文件:Employee.class,不是吗?@JeanWaghetti on Windows,是的。如果你在区分大小写的系统上进行编译,你会得到
    Employee
    Employee
    (这个问题在一个
    .java
    文件中有两个不同的类,一个是public,另一个不是)。+1解释得很好,但请详细说明你的最后一点,
    相关主题是在类/文件名中使用Unicode字母。这涉及到不同的平台、Unicode的不同规范表示(作为一个或两个Unicode代码点)、版本控制系统。