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

时间:2012-09-07 16:47:01

标签: java jar

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

但是在开发应用程序时,我不希望我的源代码文件被命名为CamelCase并分散在某些目录树中!毕竟,这是我的源代码。我更喜欢按照 me 与它们一起工作的方式组织文件,而不是对于某些愚蠢的编译器和存档器:)。我想要一个干净的“src”文件夹,其中包含“wnd_main.java”,“wnd_about.java”等文件。是否有一些 easy 方式在编译期间自动生成正确的文件名和目录结构,基于实际的源代码内容?

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

5 个答案:

答案 0 :(得分:0)

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

这似乎需要做很多工作才能避免在src层次结构中使用目录。

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

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

  1. Java要求您的文件根据其类名严格组织 想想Python,强制执行缩进。这样做是为了消除的需要 与缩进有关的编码惯例。
  2. 它为你自己的好,以防止类型的情况:

      

    如何在这么大的项目中找到这门课?   事实证明我正在写一个已经存在的类/功能   对于这个项目,我应该如何组织文件?有一些约定吗?
      什么?!在一个文件中定义了100个类?

  3. 不喜欢手动处理文件和目录结构吗? 使用IDE ,它会为您完成。

  4. 如果您仍然希望获得Java的灵活性,为什么不尝试一些基于Java的语言
    比如Groovy。或Clojure,或Scala,或...
    它们都在JVM中工作,它们的语法与Java兼容,但更多轻松许可。 这同样适用于目录结构。 奖金!您可以将Groovy脚本与Java类混合使用。
  5. 底音:实际上,非公开课不需要遵循此惯例
    如果由于一些奇怪的原因,您决定使用包访问来声明您的某个班级, 不会从您的软件包外部访问,但您可以为其指定所需的名称。

答案 3 :(得分:0)

您没有严格 .java文件整理到与软件包匹配的目录结构中 - .class文件必须采用这种结构,但{ {1}}将接受javac文件的扁平结构 - 但是,如果您这样做,您将使您的生活更轻松,因为世界上几乎所有更高级别的Java工具都希望您遵循此约定。例如,Ant依赖于.java.java目录结构之间的匹配,以便能够分辨哪些.class文件与其对应的.class相比已过时。如果结构不匹配,则每次都会重新编译每个.java文件。

但是,每个.java文件的名称必须与其定义的.java的名称相匹配(您可以在一个public class文件中包含多个类,但是其中大多数可以是.java,其名称必须与文件名匹配)。这是编译器的要求,并且不值得与之抗争。

答案 4 :(得分:0)

scons构建系统根据.java文件的内容完美地创建目录结构。安装就像pypm -g install scons一样简单。