2009-10-02 2 views
23

Я прихожу к Java и Eclipse с фона C#/Visual Studio. В последнем случае, я обычно организовать решение так:Организация папки проекта Java Eclipse

\ MyProjects \ MyApp \ MyAppsUtilities \ LowerLevelStuff

где MyApp будет содержать проект по созданию EXE-файл, MyAppsUtilities бы сделать сборку DLL под названием по .exe, а LowerLevelStuff, вероятно, построит сборку, содержащую классы, используемые DLL-утилитами более высокого уровня.

В Eclipse (Ганимед, но может быть уверен, чтобы переключиться на Galileo) у меня есть:

\ MyProjects \ рабочее место \ MyApp

Когда я создаю свой первоначальный проект. Есть возможность поместить файлы источника и сборки в одну папку, но у меня есть .java-файлы, созданные по пути, который отражает мою иерархию пакетов:

\ MyProjects \ workspace \ MyApp \ src \ com \ mycompany \ MyApp \ MyApp.java

Мой вопрос заключается в следующем: когда я создаю подпроекты (? в том, что право термина Java/Eclipse) для .jar файлов, которые будут аналогичны приведенным выше MyAppsUtilities и сборки библиотек DLL LowerLevelStuff в .NET, Может (должен) Я организую папки эквивалентно? Например:

\ MyProjects \ рабочее место \ MyApp \ SRC \ ком \ MyCompany \ MyApp \ myapputilities \ MyAppsUtilities.java

Что такое стандартный/правильный способ организовать этот материал, и как это делается specifcally в IDE?

ответ

50

Подумайте о пакетах исходного кода Java как о одном большом иерархическом пространстве имен. Коммерческие приложения обычно находятся под «com.mycompany.myapp» (сайт для этой заявки может быть «http://myapp.mycompany.com», хотя это, очевидно, не всегда так).

Как вы упорядочиваете материал под вашим пакетом myapp, в значительной степени зависит от вас. Различие, которое вы выполняете для C# между исполняемыми (.exe), DLL и низкоуровневыми классами, не существует в одной и той же форме на Java. Весь исходный код Java скомпилирован в файлы .class (содержимое которых называется «байт-код»), который может быть запущен виртуальной машиной Java (JVM) на многих платформах. Таким образом, в классах высокого уровня/низкого уровня нет присущих различий, если вы не приписываете такие уровни через свою упаковку. Общий способ упаковки:

  • com.mycompany.myapp: основной класс; MyApp (с основным методом)
  • com.mycompany.myapp.model: классы моделей доменов; Заказчик, Заказ и т. Д.
  • com.mycompany.myapp.ui: пользовательский интерфейс (представление или представление) код
  • com.mycompany.myapp.service: услуги в пределах вашего приложения, то есть 'бизнес-логика'
  • ком. mycompany.myapp.util: вспомогательные классы, используемые в нескольких местах

это предполагает автономное приложение Java, это может быть иначе, если это веб-приложение, используя один из многих структур.

Эти пакеты соответствуют иерархии каталогов в вашем проекте. При использовании Eclipse корень такой иерархии называется «исходным каталогом». Проект может определять несколько исходных каталогов, обычно «основной» и «тестовый» исходный каталог.

Пример файлов в проекте:

src/test/java/com/acme/foo/BarTest.java 
src/main/java/com/acme/foo/Bar.java 
lib/utilities_1_0.jar 

А внутри utilities_1_0.jar:

com/acme/foo/BarUtils.class 

BarUtils.class это скомпилированный класс Java, так что в платформе независимой форме байт-код, который может быть работать на любом JVM. Обычно jarfiles содержит только скомпилированные классы, хотя иногда вы можете загрузить версию jar, которая также содержит исходные (.java) файлы. Это полезно, если вы хотите прочитать исходный код файла jar, который вы используете.

В приведенном выше примере Bar, BarTest и BarUtils находятся в одном пакете com.acme.foo, но физически находятся в разных местах вашего жесткого диска.

Классы, которые находятся непосредственно в исходной папке, находятся в «пакете по умолчанию», обычно не рекомендуется содержать классы, потому что неясно, к какой компании и приложению принадлежит класс, и вы можете получить конфликты имен если какой-либо файл jar, который вы добавляете в свой путь к классу, содержит класс с таким же именем в пакете по умолчанию.

Теперь, если вы разворачиваете это приложение, оно обычно скомпилируется в .class-файлы и вставляется в .jar (что в основном является причудливым именем для .zip-файла плюс информация о манифесте). Создание приложения .jar не требуется для запуска приложения, но оно полезно при развертывании/распространении вашего приложения. Используя информацию манифеста, вы можете сделать исполняемый файл .jar, чтобы пользователь мог легко запустить его, см. [A].

Обычно вы также будете использовать несколько библиотек, то есть существующие файлы .jar, полученные из Интернета. Очень распространенными примерами являются log4j (фреймворк регистрации) или библиотеки JDBC для доступа к базе данных и т. Д. Также у вас могут быть свои собственные подмодули, которые развернуты в отдельных jarfiles (например, «utilities_1_0.jar» выше). Как вещи разделены по jarfiles - это вопрос развертывания/распространения, они все еще используют универсальное пространство имен для исходного кода Java. Таким образом, вы можете разархивировать все файлы jarfiles и поместить содержимое в одну большую структуру каталогов, если хотите (но вы, как правило, этого не делаете).

При запуске приложения Java, которое использует/состоит из нескольких библиотек, вы сталкиваетесь с тем, что обычно называют «адским путем класса». Один из самых больших недостатков Java, который мы знаем. (примечание: помощь, предположительно, on the way). Чтобы запустить приложение Java в командной строке (т. Е. Не из Eclipse), вам нужно указать каждое расположение файла .jar в пути к классам. Когда вы используете одну из многих фреймворков Java (Maven, Spring, OSGi, Gradle), обычно существует определенная форма поддержки для облегчения этой боли.Если вы создаете веб-приложение, вам просто нужно будет придерживаться своих соглашений о расслоении/развертывании, чтобы иметь возможность легко разворачивать предмет в выбранном вами веб-контейнере (Tomcat, Jetty, Glassfish).

Надеюсь, это даст общее представление о том, как все работает на Java!

[a] Для создания исполняемого флага приложения MyApp вам нужен JDK на вашем пути. Затем используйте следующую командную строку в вашей компиляции (бен или целевой) Каталог:

jar cvfe myapp.jar com.mycompany.myapp.MyApp com\mycompany\myapp 

Вы можете затем выполнить его из командной строки с:

java -jar myapp.jar 

или двойным щелчком по файлу банка. Обратите внимание, что в этом случае вы не увидите консоль Java, поэтому это полезно только для приложений, которые имеют собственный графический интерфейс (например, приложение Swing) или могут работать в фоновом режиме (например, на сервере сокетов).

+1

, так что все, что вы говорите, имеет смысл, но только когда я получаю Eclipse с иерархией папок например: com \ mydomain \ myapp \ util затем добавить исходный файл с объявлением: package com.mydomain.myapp.util; , тогда Eclipse создает целый набор новых папок в папке util: com \ mydomain \ myapp \ util \ com \ mydomain \ myapp \ util \ src \ myclass.java –

+4

Вы вводите пустую иерархию пакетов в исходную папку Eclipse. Исходная папка Eclipse должна быть чем-то вроде «src/main/java /» (если вы следуете соглашениям Maven). Это просто отправная точка для вашей иерархии пакетов; папка 'src/main/java' укажет на пакет по умолчанию. В этой папке Eclipse будет генерировать папки для соответствия пакетам, поэтому ваш класс класса окажется в /src/main/java/com/mydomain/myapp/util/myclass.java –

+0

Есть ли проект Java на GitHub с этой структурой папок для реальный пример? –

1

Обычно вы должны создавать связанные проекты/субпроекты как разные проекты в Eclipse.

+0

Итак, это плоская организация, например, следующая? [1] \ MyProjects \ workspace \ MyApp [2] \ MyProjects \ workspace \ MyAppsUtilities [3] \ MyProjects \ workspace \ LowerLevelStuff – Buggieboy

7

Maven хорошо продуман standard directory layout. Даже если вы не используете его непосредственно Maven, вы можете думать об этом как о стандарте defacto. Проекты Maven с несколькими модулями - это справедливая аналогия с макетом компоновки .net, который вы описали.

2

Есть две вещи, которые нужно прояснить, прежде чем этот вопрос можно ответить:

  1. Какой исходный код хранилища вы будете использовать?
  2. Какую систему сборки вы будете использовать для автоматического создания артефактов вне Eclipse?

Ответы будут сильно влиять на ваши варианты.

Мы выбрали «один компонент проекта проекта Eclipse», который может быть либо библиотекой, либо готовой исполняемой/исполняемой банкой. Это упростило автоматизацию с помощью Hudson. Наше использование CVS также проще, поскольку отдельные проекты не имеют нескольких обязанностей.

Примечание. Каждый проект может содержать несколько исходных папок, разделяющих, например, тестовый код из конфигурации из источника Java. Это не так важно, как упрощение вашей структуры.

Смежные вопросы