Управление зависимостями данных классов Java, которые загружают данные из пути к классам во время выполнения - PullRequest
9 голосов
/ 19 мая 2010

Каков самый простой способ управления зависимостями классов Java от файлов данных, присутствующих в пути к классам?

Более конкретно:
Как аннотировать зависимости данных? Возможно, используя аннотации Java (например, @Data)? Или, скорее, некоторые записи сборки в сценарии сборки или в файле свойств? Существует ли инструмент для сборки, который интегрирует и оценивает такую ​​информацию (Ant, Scons, ...)? У вас есть примеры?

Рассмотрим следующий сценарий:
Несколько строк Ant создают Jar из моих источников, который включает в себя все найденное на пути к классам. Затем jarjar используется для удаления всех файлов .class, которые не нужны для выполнения, скажем, класса Foo. Проблема в том, что все файлы данных, от которых зависит класс Bar, все еще находятся в Jar. Однако идеальный сценарий развертывания должен распознавать, что файлы данных, от которых зависит только класс Bar, могут быть удалены, а файлы данных, от которых зависит класс Foo, должны быть сохранены.

Есть намеки?

Ответы [ 3 ]

1 голос
/ 21 мая 2010

Это одна из многих проблем, Maven уже решена с ее сборкой, зависимостями и управлением ресурсами. Любой проект maven следует стандартной схеме каталогов, которая определяет, куда вы должны поместить ваши файлы данных: в каталоги 'resources'. Традиционная структура каталогов Maven выглядит следующим образом ...

/
/src/
/src/main/java/
/src/main/java/App.java
/src/main/resources/
/src/main/resources/my.prod.data.or.cfg.or.whatever
/src/test/java/
/src/test/java/AppTest.java
/src/test/resources/
/src/test/resources/my.test.data.or.cfg.or.whatever
/pom.xml

Преимущество этого заключается в том, что все файлы, содержащиеся в каталогах ресурсов 'main' (prod), доступны вашему приложению во время выполнения из Classpath. Все файлы 'test / resources' доступны вашему коду во время сборки и модульного тестирования, но НЕ включены в ваш последний артефакт.

0 голосов
/ 25 мая 2010

Я не думаю, что для системы, которую вы описываете, существует общее решение, однако я просто попытался прочитать аннотации к классам, используя ASM , поскольку он также используется jarjar. Таким образом нетрудно прочитать данные аннотации (передать ClassVisitor методу accept () в ClassReader и сделать что-то полезное в обратном вызове visitAnnotation). Это означает, что вы можете либо попытаться включить намеченное поведение в jarjar, либо добавить его в качестве пользовательского шага в процесс сборки.

0 голосов
/ 20 мая 2010

Не можете ли вы провести рефакторинг вашего проекта, чтобы у вас были подмодули, каждый из которых содержал соответствующие файлы для самого проекта; Файлы классов Bar и Bar будут упакованы в один пакет, а файлы Foo - в другой?

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

...