Может ли "Экспорт в JAR в Eclipse" быть таким же умным, как Javac? - PullRequest
0 голосов
/ 08 июля 2011

Я хочу экспортировать часть проекта Java в файл jar, в то же время включая только файлы классов, которые необходимы для запуска основного класса.Проект содержит другие основные классы с похожими, но не идентичными зависимостями.Я могу запустить собственный сценарий для его достижения, например:

mkdir temp
cd temp
javac -sourcepath "../" -d . ../MAINCLASS_A.java
jar cmf MAINCLASS_A.manifest ../MAINCLASS_A.jar *

Для элегантности и более простого обмена с другими, я бы хотел запустить его непосредственно из Eclipse вместо этого пользовательского сценария.Однако, когда я экспортирую в файл JAR или файл JAR Runnable, включается каждый файл класса в проекте.Я знаю, что могу настроить ручные фильтры для исключения определенных файлов, но, похоже, должен быть более разумный вариант.Как я могу настроить Eclipse так, чтобы он включал только файлы классов, от которых зависит основной класс?

Ответы [ 2 ]

2 голосов
/ 08 июля 2011

Я думаю, что то, что вы хотите сделать, невозможно в общем случае.Да, теоретически javac может найти (и найдет) все зависимости между классами.Но это правильно, только если эти зависимости жестко запрограммированы в вашем проекте, то есть вы не используете динамическую загрузку и отражение классов ни прямо, ни косвенно.

Реальные приложения обычно используют различные сторонние библиотеки, фреймворки и т. Д. Таким образом, иногда используется динамическая загрузка классов, даже если вы никогда не говорите в своем собственном коде Class.forName().Я думаю, что если вам нужна такая оптимизация, вы должны написать свой собственный скрипт, который создаст ваш собственный jar.Кстати, тот факт, что вам это нужно, вероятно, дает вам подсказку, что ваши проекты организованы неправильно.Возможно, вам следует разделить ваш проект на 2 или более.Каждый должен содержать только свои зависимости.В этом случае вы можете использовать встроенную возможность затмения для упаковки файлов JAR.

0 голосов
/ 08 июля 2011

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

Скажем, мы загружаем класс, используя Class.forName("com.foo.Bar").В этом случае единственная ссылка на com.foo.Bar внутри основного класса - это строковый литерал, который не будет загружен javac или jar.

Таким образом, единственный вариант - установить вручнуюФильтры, сохраните файл .jardesc и используйте его в качестве сценария для создания подобных файлов Jar позже.

Это должно дать вам преимущество.

http://help.eclipse.org/indigo/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Ftasks%2Ftasks-33.htm

...