2016-11-02 3 views
0

У меня есть проект Java, управляемый Maven, развернутым в Glassfish.Безопасное удаление «неиспользуемых» зависимостей времени выполнения

Мой вопрос в том, как я могу безопасно удалить зависимые от maven зависимости, которые могут быть зависимостями от времени выполнения?

Я использовал maven dependency plugin для выявления неиспользуемых зависимостей унаследованного проекта:

mvn dependency:analyze -DignoreNonCompile=true 

Выход выглядит следующим образом:

[INFO] --- maven-dependency-plugin:2.8:analyze (default-cli) @ MyProject --- 
[WARNING] Used undeclared dependencies found: 
[WARNING] commons-collections:commons-collections:jar:3.2:compile 
[WARNING] commons-beanutils:commons-beanutils:jar:1.7.0:compile 
[WARNING] org.apache.cxf:cxf-core:jar:3.1.3:compile 
[WARNING] junit:junit:jar:4.11:test 
[WARNING] org.springframework:spring-test:jar:4.1.6.RELEASE:test 
[WARNING] com.fasterxml.jackson.core:jackson-databind:jar:2.4.3:compile 
[WARNING] ca.uhn.hapi:hapi-base:jar:2.2:compile 
[WARNING] org.apache.camel:camel-core:jar:2.15.3:compile 
[WARNING] Unused declared dependencies found: 
[WARNING] org.apache.camel:camel-cxf:jar:2.15.3:compile 
[WARNING] org.apache.cxf:cxf-rt-bindings-soap:jar:3.1.3:compile 
[WARNING] org.apache.camel:camel-jms:jar:2.15.3:compile 
[WARNING] net.sf.saxon:Saxon-HE:jar:9.5.1-5:compile 
[WARNING] org.apache.camel:camel-mina2:jar:2.15.3:compile 
[WARNING] com.google.code.gson:gson:jar:2.7:compile 
[WARNING] org.springframework:spring-jms:jar:4.2.1.RELEASE:compile 
[WARNING] org.springframework:spring-web:jar:4.2.1.RELEASE:compile 
[WARNING] org.springframework:spring-orm:jar:4.2.1.RELEASE:compile 
[WARNING] org.apache.cxf:cxf-rt-frontend-jaxws:jar:3.1.3:compile 
[WARNING] org.apache.camel:camel-spring-ws:jar:2.15.3:compile 
[WARNING] org.apache.camel:camel-saxon:jar:2.15.3:compile 
[WARNING] org.apache.camel:camel-servlet:jar:2.15.3:compile 
[WARNING] org.apache.camel:camel-hl7:jar:2.15.3:compile 
[WARNING] org.apache.camel:camel-spring:jar:2.15.3:compile 
[WARNING] org.apache.camel:camel-ftp:jar:2.15.3:compile 
[WARNING] org.apache.camel:camel-velocity:jar:2.15.3:compile 
[WARNING] ch.qos.logback:logback-classic:jar:1.1.2:compile 
[WARNING] org.apache.cxf:cxf-rt-transports-http:jar:3.1.3:compile 
[WARNING] org.apache.camel:camel-ejb:jar:2.15.3:compile 
[WARNING] org.slf4j:slf4j-api:jar:1.7.7:compile 

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

Опция ignoreNonCompile Я включил обетования «Игнорировать время выполнения/Предоставленные/Тестирование/Системные области для неиспользуемого анализа зависимостей», но насколько я знаю, настройка области зависимости - это то, что делает разработчик (этого не происходит автоматически), и поэтому я не думаю, что могу быть уверен, что эти «неиспользуемые» зависимости не являются фактически зависимостями времени исполнения.

Причина, по которой я отметил этот вопрос apache-camel, объясняется тем, что я беспокоюсь о том, что плагин зависимостей maven, скорее всего, неправильно идентифицирует «неиспользуемые» зависимости Camel из-за Camel DSL. Например, camel-ftp компонент используется в DSL, который выглядит следующим образом:

from("ftp://[email protected]?password=secret&ftpClient.dataTimeout=30000").to("bean:foo"); 

Я думаю, что, насколько это касается Maven это только String, поэтому он не может понять, что проект имеет реальную зависимость на компоненте camel-ftp.

Мой вопрос в том, как я могу безопасно удалить зависимости, которые могут быть зависимостями во времени выполнения?

+1

Используйте такую ​​систему, как ProGuard, которая анализирует зависимости на уровне байтового кода и выбрасывает неиспользуемые классы. –

+0

Спасибо за идею, @SeanPatrickFloyd: это хороший! ProGuard собирается потратить некоторое время на изучение и настройку, особенно для большого проекта. Я не боюсь работы, но даже после того, как я думаю, мне все равно хотелось бы очистить мои файлы pom.xml: я бы не хотел включать ненужные зависимости в первую очередь. – DavidS

+0

Я понимаю, но эта часть намного сложнее. Возможно, вы можете использовать ProGuard только для анализа и использовать вывод, чтобы определить, какие зависимости вам нужно сохранить? –

ответ

1

Camel динамически создает классы и использует интерфейсы, а не конкретные классы для таких вещей, как camel-ftp. В этом случае инструмент байтового кода бесполезен при анализе зависимостей.

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

Если вы действительно хотите обрезать зависимости, попробуйте исключить использование компонентов * -spring и использовать план или Java DSL. Компоненты Spring имеют тенденцию иметь много транзитивных зависимостей.

+0

Спасибо Мэтту! Поэтому «зависимость: анализ», вероятно, возвращает много ложных срабатываний в отношении Camel, и ProGuard вряд ли будет лучше, так как это также инструмент байт-кода. Хотелось бы, чтобы у меня был комплект комплексных тестов, но я не смогу его добавить. Думаю, я просто обращу внимание на рефакторинг в другом месте. – DavidS

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