Можно ли автоматически создать иерархию каталогов в файле .jar?

Я редко использую Java, поэтому мои знания о современной экосистеме очень ограничены :(. Насколько я знаю, Java сильно склеена с иерархией каталогов и именами файлов: например, если у меня есть файл .jar с «com.mycompany.myapp. WndMain", соответствующий файл .class должен называться точно "WndMain.class" (с учетом регистра!) и помещаться в дерево каталогов "com/mycompany/myapp" внутри файла .jar (фактически это .zip-архив).

Но при разработке приложений я не хочу, чтобы мои файлы с исходным кодом назывались CamelCase и были разбросаны по некоторым деревьям каталогов! В конце концов, это мой исходный код. Я предпочитаю, чтобы файлы были организованы так, чтобы мне было удобно с ними работать, а не какому-то тупому компилятору и архиватору :). Мне нужна чистая папка «src» с такими файлами, как «wnd_main.java», «wnd_about.java» и т. д. Это какой-то простой способ автоматически генерировать правильные имена файлов и структуру каталогов во время компиляции на основе фактическое содержание исходного кода?

Конечно, я могу создать собственный скрипт - через Python, Ruby, Shell или что-то еще - который будет читать содержимое файлов ".java", анализировать директивы "using" и "class", создавать структуру каталогов, копировать файлы, компилировать и т. д. .. Но, может быть, все это уже сделано много лет назад, и все, что мне нужно, это что-то вроде «sudo apt-get install javamake»? :)


person grigoryvp    schedule 07.09.2012    source источник


Ответы (5)


Нет, компилятор не позволит вам объявить классы, в которых объявленное имя пакета в файле (например, package com.mycopmany.myapp) не соответствует фактической структуре каталогов на диске.

Кажется, что нужно проделать большую работу, чтобы избежать наличия каталогов в вашей src иерархии.

person matt b    schedule 07.09.2012

Это будет сложной задачей, так как имя пакета внутри каждого исходного файла ДОЛЖНО совпадать со структурой каталогов, как сказал @mattb, но вы можете использовать какой-нибудь инструмент сборки, например Ant (наиболее часто используемый) для создания решения, которое вы ищете.

Например, если ваш источник организован следующим образом:

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

Вы можете использовать Ant, чтобы скопировать все исходные файлы во временный каталог, скомпилировать и упаковать их в .jar, но, как я уже сказал, у вас будут некоторые проблемы, такие как конфликты имен (пример: у вас могут быть классы с одним и тем же именем в разных направления). Все ваши классы должны иметь разные имена, и все классы должны иметь доступ друг к другу, поскольку они находятся в одном пакете. Вся эта проблема связана с решением, которое я предлагаю. Можно, конечно, модифицировать код файлов, которые были скопированы во временную директорию, но я действительно не думаю, что все это стоит пробовать... Я искренне рекомендую вам следовать "пути разработки" в Java, используя некоторую IDE, следуя Соглашениям о коде Java и т. д.

person davidbuzatto    schedule 07.09.2012

Вы не обязаны строго обязаны организовывать свои .java файлы в структуру каталогов, которая соответствует пакетам — .class файлы должны быть в такой структуре, но javac примет плоскую структуру для .java файлов — однако вы ваша жизнь намного облегчится, если вы сделаете это, так как почти все инструменты Java более высокого уровня в мире ожидают, что вы будете следовать этому соглашению. Например, Ant использует соответствие между структурами каталогов .java и .class, чтобы определить, какие файлы .class устарели по сравнению с соответствующими им файлами .java. Если структуры не совпадают, он каждый раз будет перекомпилировать каждый .java файл.

Однако имя каждого .java файла должно совпадать с именем public class, которое он определяет (у вас может быть несколько классов в одном .java файле, но не более одного из них может быть public, и его имя должно совпадать с именем файла ). Это требование компилятора, и с этим не стоит бороться.

person Ian Roberts    schedule 07.09.2012
comment
Действительно? Я думал, что пути .java и .class должны совпадать с именем класса. Никогда в жизни я не мог объявить публичный класс не в том файле. Мой компилятор не позволяет мне это сделать. - person Alba Mendez; 07.09.2012
comment
Я подозреваю, что все IDE будут применять структуру пакетов для исходных файлов, но технически это не требование компилятора. Попробуйте создать простой Hello.java с объявлением пакета, а затем выполните javac -d . Hello.java - это сработает, и поместите файл Hello.class в подкаталог пакета. - person Ian Roberts; 07.09.2012
comment
Это не обязательно, если классы не являются общедоступными. Но большинство классов являются общедоступными. - person Alba Mendez; 07.09.2012
comment
Вы путаете мои два пункта. Да, имя файла должно совпадать с базовым именем (общедоступного) класса, но javac не требует, чтобы исходные файлы находились в структуре каталогов, соответствующей именам их пакетов. Однако некоторые IDE могут потребовать этого. - person Ian Roberts; 07.09.2012

Это бессмысленно. Здесь трудно найти вопрос.
Но я постараюсь ответить:

  1. Java требует, чтобы ваши файлы были строго организованы в соответствии с именами классов.
    Вспомните Python, который применяет отступы. Это делается для того, чтобы устранить необходимость
    в соглашениях по кодированию, связанных с отступами.
  2. #P2# <блочная цитата> #P3#
  3. Не хотите работать со структурой файлов и каталогов вручную?
    Используйте интегрированную среду разработки, она сделает это за вас.

  4. Если вам по-прежнему нужна гибкость Java, почему бы не попробовать некоторые языки на основе Java?
    Например, Groovy. Или Clojure, или Scala, или...
    Все они работают в JVM, их синтаксис совместим с Java, но более непринужденный и разрешающий. То же самое относится и к структуре каталогов. Бонус! Вы можете смешивать сценарии Groovy с классами Java.

Примечание внизу: На самом деле, закрытые классы не обязаны следовать этому соглашению.
Если по какой-то странной причине вы решите объявить один из ваших классов с помощью < strong>доступ к пакету,
он не будет доступен из-за пределов вашего пакета, но вы можете дать ему любое имя.

person Alba Mendez    schedule 07.09.2012

scons система сборки отлично создает структуру каталогов в соответствии с содержимым .java файлов. Установка проста как pypm -g install scons.

person grigoryvp    schedule 07.09.2012