Java 是否可以在.jar文件中自动创建目录层次结构?

Java 是否可以在.jar文件中自动创建目录层次结构?,java,jar,Java,Jar,我很少使用java,所以我对现代生态系统的了解非常有限:(.AFAIK,java与目录层次结构和文件名紧密相连:例如,如果我有一个.jar文件 “com.mycompany.myapp.WndMain”类中,相应的.class文件必须准确命名为“WndMain.class”(区分大小写!),并放置在.jar文件(实际上是一个.zip归档文件)中的“com/mycompany/myapp”目录树中 但是,在开发应用程序时,我不希望我的源代码文件被命名为CamelCase并分散在一些目录树中!毕竟,

我很少使用java,所以我对现代生态系统的了解非常有限:(.AFAIK,java与目录层次结构和文件名紧密相连:例如,如果我有一个.jar文件 “com.mycompany.myapp.WndMain”类中,相应的.class文件必须准确命名为“WndMain.class”(区分大小写!),并放置在.jar文件(实际上是一个.zip归档文件)中的“com/mycompany/myapp”目录树中

但是,在开发应用程序时,我不希望我的源代码文件被命名为CamelCase并分散在一些目录树中!毕竟,这是我的源代码。我更喜欢文件的组织方式,让me轻松地使用它们,而不是让一些愚蠢的编译器和架构师:)。我想要一个干净的“src”文件夹,其中包含“wnd_main.java”、“wnd_about.java”等文件。这是一种根据实际源代码内容在编译过程中自动生成正确文件名和目录结构的方法吗


当然,我可以创建自己的脚本——通过Python、Ruby、Shell或其他方式——读取“.java”文件的内容,解析“using”和“class”指令,创建目录结构,复制文件,编译等等。。。但也许这一切在几年前就已经完成了,我所需要的只是“sudo apt get install javamake”?:)

否,如果文件中声明的包名(如
package com.mycopmany.myapp
)与磁盘上的实际目录结构不匹配,编译器将不允许您声明类


要避免在
src
层次结构中有目录,这似乎需要做很多工作。

这将是一项困难的任务,因为每个源文件中的包名必须与@mattb所说的目录结构相同,但您可以使用一些构建工具,如(最常用的一个)创建您正在寻找的解决方案

例如,如果以这种方式组织源:

src
    foo
        class_1.java
        class_2.java
    bar
        class_3.java
        class_4.java

您可以使用Ant将所有源文件复制到临时目录,然后编译并打包到.jar中,但正如我所说的,您将遇到一些问题,比如名称冲突(例如:您可以在不同的目录中使用相同名称的类)。所有类都必须具有不同的名称,并且所有类都必须相互访问,因为它们位于同一个包中。所有这些问题都与我提出的解决方案有关。当然,您可以修改复制到临时目录的文件的代码,但我真的不认为所有这些都值得尝试。。。我真诚地建议您遵循Java中的“开发方式”,使用一些IDE,遵循等等。

这是毫无意义的。在这里很难找到问题。
但我会尽力回答:

  • Java要求文件按照其类名进行严格组织。
    想想Python,它强制执行缩进。它这样做是为了消除这种需要
    与缩进相关的编码约定
  • 它这样做是为了你好,以防止出现以下情况:

    在这么大的一个项目中,我是如何发现这门课的?
    原来我在写一个已经存在的类/特性。
    对于这个项目,我应该如何组织文件?有什么惯例吗?
    什么
    单个文件中定义的100个类

  • 不喜欢手动处理文件和目录结构吗?
    使用IDE,它会为您做到这一点

  • 如果您仍然希望Java具有灵活性,为什么不尝试一些基于Java的语言呢 比如说Groovy。或Clojure,或Scala,或…
    它们都在JVM中工作,它们的语法与Java兼容,但更为宽松和允许。 这同样适用于目录结构奖金您可以将Groovy脚本与Java类混合使用
  • 底部注释:实际上,非公共类不需要遵循此约定
    如果出于某种奇怪的原因,您决定声明一个具有包访问权限的类,
    无法从软件包外部访问它,但是你可以给它取你想要的名字。

    你不必严格地把
    .java
    文件组织到一个与包相匹配的目录结构中-
    。class
    文件必须是这样一种结构,但是
    javac
    将接受
    .java
    文件的平面结构-但是你会让你的生活更轻松如果您按照世界上几乎所有更高级别的Java工具所期望的那样去做,那么您将遵循这个约定。例如,Ant依赖于
    .java
    .class
    目录结构之间的匹配,以便能够判断哪些
    .class
    文件相对于相应的
    .java
    已过期。如果结构不匹配,它将每次重新编译每个
    .java
    文件


    但是,每个
    .java
    文件的名称必须与它定义的
    公共类的名称匹配(一个
    .java
    文件中可以有多个类,但最多只能有一个
    公共类
    且其名称必须与文件名匹配)。这是编译器的要求,不值得反对。

    scons
    build系统根据
    .java
    文件的内容完美地创建目录结构。安装就像安装烤饼一样简单,真的吗?我认为
    .java
    .class
    路径名必须与类名匹配。在我的一生中,我从来没有在错误的文件中声明过公共类。我的编译器不允许我这样做。我怀疑所有的IDE都会对源文件强制使用包结构,但从技术上讲,这不是编译器的要求。尝试使用包声明创建一个简单的
    Hello.java