Подскажите как можно исправить ситуацию? Мы используем cuba 6.10. В сборку в папке lib попадают 2 файла javaee-api-7.0.jar и javax.mail-1.5.4.jar. При попытке использовать код из javax.mail библиотеки вылетает ошибка несоответствия версия (ругается, что метод не существует). Проблема в том, что Java код пытается взять классы javax.mail из javaee-api-7.0.jar (а там версия 1.5.0), а должен брать из javax.mail-1.5.4.jar.
Если нужен пример кода, могу скинуть.
Пример кода естественно не помешает.
Добрый день,
У нас недавно всплыла та же проблема с дублирующимися классами в этих библиотеках.
Например класс javax.mail.internet.MimeUtility присутствует в двух версиях, и на разных машинах (windows vs linux) подхватывается то один то другой.
Разработчик временно решил проблему для tomcat путем изменения файла tomcat/conf/catalina.properties.
# jar javaee-api-7.0.jar must be first because it and javax.mail-*.jar have same full class name, but different behaviour
shared.loader="${catalina.base}/shared/lib/javaee-api-7.0.jar","${catalina.base}/shared/lib/*.jar"
Вроде работает.
Но вообще ничего хорошего что у нас в зависимостях дублируются целые пакеты, с разными версиями.
В нашем случаем мы используем Jetty и собираем всё в war файлы. Т.е. не можем использовать shared lib
package com.elgsys.elg.core.service.email;
import com.elgsys.elg.common.EmailNotificator;
import com.haulmont.cuba.core.EntityManager;
import com.haulmont.cuba.core.Persistence;
import com.haulmont.cuba.core.Query;
import com.haulmont.cuba.core.Transaction;
import com.haulmont.cuba.core.app.EmailerConfig;
import com.haulmont.cuba.core.entity.SendingMessage;
import com.haulmont.cuba.core.global.DataManager;
import com.haulmont.cuba.core.global.EmailInfo;
import com.haulmont.cuba.core.global.LoadContext;
import com.haulmont.cuba.core.sys.AppContext;
import org.jsoup.Jsoup;
import org.springframework.stereotype.Service;
import java.util.*;
import javax.inject.Inject;
import javax.mail.*;
@Service(InboxHandlerService.NAME)
public class InboxHandlerServiceBean implements InboxHandlerService {
@Inject
private Persistence persistence;
@Inject
private EmailNotificator emailNotificator;
@Inject
private DataManager dataManager;
@Inject
private EmailerConfig config;
private String TEST_EMAIL = "testemail@domain.com";
private String TRASH_EMAIL = "trashemail@domain.com";
@Override
public void checkInbox() {
Properties props = new Properties();
try {
props.put("mail.imap.host", Objects.requireNonNull(AppContext.getProperty("cuba.email.imap.host")));
props.put("mail.imap.ssl.enable", Objects.requireNonNull(AppContext.getProperty("cuba.email.imap.ssl.enable")));
props.put("mail.debug", Objects.requireNonNull(AppContext.getProperty("cuba.email.debug")));
props.put("mail.imap.port", Objects.requireNonNull(AppContext.getProperty("cuba.email.imap.port")));
props.put("mail.imap.socketFactory.port", Objects.requireNonNull(AppContext.getProperty("cuba.email.imap.socketFactory.port")));
props.put("mail.imap.socketFactory.class", Objects.requireNonNull(AppContext.getProperty("cuba.email.imap.socketFactory.class")));
Session session = Session.getDefaultInstance(props, null);
Store store = session.getStore(AppContext.getProperty("cuba.email.protocol.imaps"));
store.connect(props.getProperty("mail.imap.host"), AppContext.getProperty("cuba.email.smtpUser"), AppContext.getProperty("cuba.email.smtpPassword"));
Folder inbox = store.getFolder(AppContext.getProperty("cuba.email.folder.inbox"));
inbox.open(Folder.READ_WRITE);
Message[] messages = Arrays.stream(inbox.getMessages()).filter(message -> {
try {
return !message.getFlags().contains(Flags.Flag.SEEN);
} catch (MessagingException e) {
e.printStackTrace();
return true;
}
}).toArray(Message[]::new);
for (Message message : messages) {
if (!message.getFlags().contains(Flags.Flag.SEEN)) { // если письмо не прочитано
String subject = message.getSubject();
Address[] address = message.getFrom();
String tmp = address[0].toString();
String from;
if (tmp.contains("<") && tmp.contains(">")) {
from = tmp.substring(tmp.indexOf("<") + 1, tmp.indexOf(">")); //почта отправителя
} else {
from = tmp;
}
String emails;
String FIOs;
String body;
if (message.getContent() != null) {
body = message.getContent().toString() + "\n";
} else {
body = getBodyFromMessage(subject);
}
if (!body.equals("") && subject.contains("[" + AppContext.getProperty("system.name") + "]")) {
/*OFFICE*/
if (subject.contains("Необходимо создать ежемесячную заявку")) {
body = Jsoup.parse(body).text();
String services = body.substring(body.indexOf("номером ") + 8, body.indexOf(" нет"));
alertSuppliersByGroupingByServices(services, body, subject, from);
} else if (subject.contains("Необходимо создать ежемесячные заявки")) {
body = Jsoup.parse(body).text();
String services = body.substring(body.indexOf("номерами ") + 9, body.indexOf(" нет"));
alertSuppliersByGroupingByServices(services, body, subject, from);
} else if (subject.contains("Необходимо подтвердить объёмы услуги")) {
body = Jsoup.parse(body).text();
String technicalTaskName = body.substring(body.indexOf("заданию «") + 9, body.indexOf("»"));
FIOs = getFIOsByTechnicalTask(technicalTaskName);
String attention = "Уведомление не доставлено получателю!\n" +
"Почта получаетля: " + from + "\n" +
"ФИО пользователей, которым алгортим должен переслать это сообщение: " + FIOs + "\n" +
"Текст ответного сообщения:\n";
String body1 = attention + body;
//emails = getEmailsByTechnicalTask(technicalTaskName);
//sendBasicEmail(emails,subject,body);
sendBasicEmail(TEST_EMAIL, subject, body1);
} else if (subject.contains("Необходимо утвердить поставщика по заявке на новую услугу")) {
body = Jsoup.parse(body).text();
FIOs = getFIOsPIByCustomerEmail(from);
String attention = "Уведомление не доставлено получателю!\n" +
"Почта получаетля: " + from + "\n" +
"ФИО пользователей, которым алгортим должен переслать это сообщение: " + FIOs + "\n" +
"Текст ответного сообщения:\n";
String body1 = attention + body;
//emails = getEmailsPIByCustomerEmail(from);
//sendBasicEmail(emails,subject,body);
sendBasicEmail(TEST_EMAIL, subject, body1);
} else if (subject.contains("Дедлайн для создания ежемесячной заявки прошел")) {
body = Jsoup.parse(body).text();
String services = body.substring(body.indexOf("с номером ") + 10, body.indexOf(" прошел"));
alertSuppliersByGroupingByServices(services, body, subject, from);
} else if (subject.contains("Дедлайн для создания ежемесячных заявок прошел")) {
body = Jsoup.parse(body).text();
String services = body.substring(body.indexOf("номерами ") + 9, body.indexOf(" нет"));
alertSuppliersByGroupingByServices(services, body, subject, from);
} else if (subject.contains("Поставщик внес коррективы в объем оказанных услуг")) {
body = Jsoup.parse(body).text();
String services;
try {
services = body.substring(body.indexOf("с номерами:") + 11, body.indexOf("Требуется"));
services = services.replaceAll(" \\([^)]*\\)", ", ");
} catch (Exception e) {
services = body.substring(body.indexOf("заявке ") + 7, body.indexOf(" за период"));
}
alertSuppliersByGroupingByServices(services, body, subject, from);
} else if (subject.contains("Изменение стоимости услуг")) {
body = Jsoup.parse(body).text();
String user = body.substring(body.indexOf("Пользователь ") + 13, body.indexOf(" (поставщик"));
FIOs = user;
String attention = "Уведомление не доставлено получателю!\n" +
"Почта получаетля: " + from + "\n" +
"ФИО пользователей, которым алгортим должен переслать это сообщение: " + FIOs + "\n" +
"Текст ответного сообщения:\n";
String body1 = attention + body;
//emails = getEmailsByNameOrLogin(user);
//sendBasicEmail(emails,subject,body);
sendBasicEmail(TEST_EMAIL, subject, body1);
}
/*INDUSTRIAL, TRANSPORT - SOON*/
else { // все остальные письма, которые содержат название системы в теме будут перенаправляться сюда
sendBasicEmail(TRASH_EMAIL, "[UNHANDLED]" + subject, body);
}
}
}
message.setFlag(Flags.Flag.SEEN, true);
}
inbox.close(true);
store.close();
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public String getSystemName() {
return Objects.requireNonNull(AppContext.getProperty("system.name"));
}
private String getEmailsByNameOrLogin(String user) {
List<String> content = new ArrayList<>();
StringBuilder emails = new StringBuilder();
try (Transaction tx = persistence.createTransaction()) {
EntityManager entityManager = persistence.getEntityManager();
Query nativeQuery = entityManager.createNativeQuery("select distinct email from SEC_USER u " +
"where u.name = #user or u.login = #user")
.setParameter("user", user);
content = (List<String>) nativeQuery.getResultList();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
for (String email : content) {
emails.append(email);
emails.append("; ");
}
return String.valueOf(emails);
}
private void alertSuppliersByGroupingByServices(String services, String body, String subject, String from) {
String emails = "";
String FIOs;
String[] serviceList = getServicesFromBody(services);
for (int k = 0; k < serviceList.length; k++) {
String temp = "";
String currentService = serviceList[k];
Long supplier = getSupplierByService(serviceList[k]);
for (int l = k + 1; l < serviceList.length; l++) {
if (!serviceList[l].equals(""))
if (Objects.equals(supplier, getSupplierByService(serviceList[l]))) {
temp = serviceList[l];
currentService += ", ";
currentService += temp;
serviceList[l] = "";
}
}
if (!currentService.equals("")) {
//emails = getEmailsByServiceNumber(temp);
FIOs = getFIOsByServiceNumber(temp);
String body1;
if (currentService.contains(","))
body1 = "Уведомление для услуг " + currentService + " не доставлено получателю!\n" +
"Почта получателя: " + from + "\n" +
"ФИО пользователей, которым алгортим должен переслать это сообщение: " + FIOs + "\n" +
"Текст ответного сообщения:\n" + body;
else
body1 = "Уведомление для услуги " + currentService + " не доставлено получателю!\n" +
"Почта получателя: " + from + "\n" +
"ФИО пользователей, которым алгортим должен переслать это сообщение: " + FIOs + "\n" +
"Текст ответного сообщения:\n" + body;
//sendBasicEmail(emails,subject,body);
sendBasicEmail(TEST_EMAIL, subject, body1);
}
}
}
private String getEmailsPIByCustomerEmail(String from) {
List<String> content = new ArrayList<>();
StringBuilder emails = new StringBuilder();
try (Transaction tx = persistence.createTransaction()) {
EntityManager entityManager = persistence.getEntityManager();
Query nativeQuery = entityManager.createNativeQuery("select distinct u.email from SEC_USER u inner join ELG_EMPLOYEE e " +
"on e.account_id = u.id where exists (select 1 from SEC_USER_ROLE ur where ur.role_id = '00907744-5a41-2e46-aaca-089c1e1803f4' " + //role_id = role PI id
"and u.id = ur.user_id and exists (select 1 from SEC_USER u1 inner join ELG_EMPLOYEE e1 on e1.account_id = u1.id " +
"where u1.email = #from and e1.employer_id = e.employer_id))")
.setParameter("from", from);
content = (List<String>) nativeQuery.getResultList();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
for (String email : content) {
emails.append(email);
emails.append("; ");
}
return emails.toString();
}
private String getFIOsPIByCustomerEmail(String from) {
List<String> content = new ArrayList<>();
StringBuilder emails = new StringBuilder();
try (Transaction tx = persistence.createTransaction()) {
EntityManager entityManager = persistence.getEntityManager();
Query nativeQuery = entityManager.createNativeQuery("select concat(e.last_name, ' ', e.first_name) from SEC_USER u inner join ELG_EMPLOYEE e " +
"on e.account_id = u.id where exists (select 1 from SEC_USER_ROLE ur where ur.role_id = '00907744-5a41-2e46-aaca-089c1e1803f4' " + //role_id = role PI id
"and u.id = ur.user_id and exists (select 1 from SEC_USER u1 inner join ELG_EMPLOYEE e1 on e1.account_id = u1.id " +
"where u1.email = #from and e1.employer_id = e.employer_id))")
.setParameter("from", from);
content = (List<String>) nativeQuery.getResultList();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
for (String email : content) {
emails.append(email);
emails.append("; ");
}
return emails.toString();
}
private String getEmailsByTechnicalTask(String technicalTaskName) {
List<String> content = new ArrayList<>();
StringBuilder emails = new StringBuilder();
try (Transaction tx = persistence.createTransaction()) {
EntityManager entityManager = persistence.getEntityManager();
Query nativeQuery = entityManager.createNativeQuery("select distinct email from SEC_USER u " +
"inner join ELG_SUPPLIER_EMPLOYEE se on se.login_id = u.id " +
"inner join ELG_TECHNICAL_TASK tt on tt.supplier_id = se.employer_id and tt.name = #technicalTaskName " +
"inner join ELG_INDUSTRIAL_SUPPLIER_MANAGER_FACILITY ismf on tt.facility_id = ismf.facility_id and se.id = ismf.manager_id")
.setParameter("technicalTaskName", technicalTaskName);
content = (List<String>) nativeQuery.getResultList();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
for (String email : content) {
emails.append(email);
emails.append("; ");
}
return emails.toString();
}
private String getFIOsByTechnicalTask(String technicalTaskName) {
List<String> content = new ArrayList<>();
StringBuilder FIOs = new StringBuilder();
try (Transaction tx = persistence.createTransaction()) {
EntityManager entityManager = persistence.getEntityManager();
Query nativeQuery = entityManager.createNativeQuery("select concat(se.last_name, ' ', se.first_name) from ELG_SUPPLIER_EMPLOYEE se " +
"inner join ELG_TECHNICAL_TASK tt on tt.supplier_id = se.employer_id and tt.name = #technicalTaskName " +
"inner join ELG_INDUSTRIAL_SUPPLIER_MANAGER_FACILITY ismf on tt.facility_id = ismf.facility_id and se.id = ismf.manager_id")
.setParameter("technicalTaskName", technicalTaskName);
content = (List<String>) nativeQuery.getResultList();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
for (String FIO : content) {
FIOs.append(FIO);
FIOs.append("; ");
}
return FIOs.toString();
}
private void sendBasicEmail(String emails, String subject, String body) {
emails = emails.replace("noreply77@elg-sys.com;", "");
if (!emails.equals("")) {
EmailInfo emailInfo = new EmailInfo(emails, subject, null, body);
emailNotificator.sendEmailNotification(emailInfo);
}
}
private Long getSupplierByService(String service) {
Long supplier = 0L;
try (Transaction tx = persistence.createTransaction()) {
EntityManager entityManager = persistence.getEntityManager();
Query nativeQuery = entityManager.createNativeQuery("select oc.supplier_id from ELG_OFFICE_OUTSOURCING_REGISTRY oor " +
"inner join ELG_OUTSOURCING_CONTRACT oc on oor.contract_id = oc.id " +
"where oor.service_number = #service")
.setParameter("service", service);
supplier = (Long) nativeQuery.getFirstResult();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
return supplier;
}
private String getEmailsByServiceNumber(String service) {
List<String> content = new ArrayList<>();
StringBuilder emails = new StringBuilder();
try (Transaction tx = persistence.createTransaction()) {
EntityManager entityManager = persistence.getEntityManager();
Query nativeQuery = entityManager.createNativeQuery("select distinct email from SEC_USER u " +
"inner join ELG_SUPPLIER_EMPLOYEE se on se.login_id = u.id " +
"inner join ELG_OUTSOURCING_CONTRACT_SUPPLIER_EMPLOYEE_LINK ocsel on ocsel.supplier_employee_id = se.id " +
"where exists(select 1 from ELG_OFFICE_OUTSOURCING_REGISTRY oor " +
"inner join ELG_OUTSOURCING_CONTRACT oc on oor.contract_id = oc.id " +
"where oc.id = ocsel.outsourcing_contract_id and oor.service_number = #service)")
.setParameter("service", service);
content = (List<String>) nativeQuery.getResultList();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
for (String email : content) {
emails.append(email);
emails.append("; ");
}
return emails.toString();
}
private String getFIOsByServiceNumber(String service) {
List<String> content = new ArrayList<>();
StringBuilder emails = new StringBuilder();
try (Transaction tx = persistence.createTransaction()) {
EntityManager entityManager = persistence.getEntityManager();
Query nativeQuery = entityManager.createNativeQuery("select concat(se.last_name, ' ', se.first_name) from ELG_SUPPLIER_EMPLOYEE se " +
"inner join ELG_OUTSOURCING_CONTRACT_SUPPLIER_EMPLOYEE_LINK ocsel on ocsel.supplier_employee_id = se.id " +
"where exists(select 1 from ELG_OFFICE_OUTSOURCING_REGISTRY oor " +
"inner join ELG_OUTSOURCING_CONTRACT oc on oor.contract_id = oc.id " +
"where oc.id = ocsel.outsourcing_contract_id and oor.service_number = #service)")
.setParameter("service", service);
content = (List<String>) nativeQuery.getResultList();
tx.commit();
} catch (Exception e) {
e.printStackTrace();
}
for (String email : content) {
emails.append(email);
emails.append("; ");
}
return emails.toString();
}
private String[] getServicesFromBody(String services) {
int end, i = 1;
for (char c : services.toCharArray()) {
if (c == ',')
i++;
}
String[] serviceList = new String[i];
i = 0;
while (!services.equals("")) {
if (services.contains(",")) {
end = services.indexOf(",");
String service = services.substring(0, end);
services = services.replace(service + ", ", "");
serviceList[i] = service;
} else {
serviceList[i] = services;
services = "";
}
i++;
}
return serviceList;
}
private String getBodyFromMessage(String subject) {
int startIndex;
try {
startIndex = subject.indexOf("[" + AppContext.getProperty("system.name") + "]");
startIndex += 11;
} catch (Exception e) {
return "";
}
String token = subject.substring(startIndex, startIndex + 6);
List<SendingMessage> content;
LoadContext.Query query = LoadContext.createQuery("select sm from sys$SendingMessage sm where sm.caption LIKE :token")
.setParameter("token", "%" + token + "%");
content = dataManager.loadList(LoadContext.create(SendingMessage.class).setQuery(query));
if (content != null && content.get(0) != null)
return content.get(0).getContentText();
return "";
}
}
Здравствуйте.
Какая ошибка вылетает с отсутствием метода? Не могли бы вы приложить stacktrace.
Стектрейс ниже. Повторю, что воспроизводится только по Linux и в Jetty App Server
2019-02-07 01:56:53.491 ERROR [ScheduledRunnerThread-8/myservice-core/admin] com.haulmont.cuba.core.sys.ServiceInterceptor - Exception:
java.lang.NoSuchMethodError: javax.mail.internet.ParameterList.combineSegments()V
at com.sun.mail.imap.protocol.BODYSTRUCTURE.parseParameters(BODYSTRUCTURE.java:424)
at com.sun.mail.imap.protocol.BODYSTRUCTURE.<init>(BODYSTRUCTURE.java:244)
at com.sun.mail.imap.protocol.BODYSTRUCTURE.<init>(BODYSTRUCTURE.java:110)
at com.sun.mail.imap.protocol.FetchResponse.parseItem(FetchResponse.java:260)
at com.sun.mail.imap.protocol.FetchResponse.parse(FetchResponse.java:215)
at com.sun.mail.imap.protocol.FetchResponse.<init>(FetchResponse.java:96)
at com.sun.mail.imap.protocol.IMAPProtocol.readResponse(IMAPProtocol.java:350)
at com.sun.mail.iap.Protocol.command(Protocol.java:357)
at com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:1937)
at com.sun.mail.imap.protocol.IMAPProtocol.fetch(IMAPProtocol.java:1929)
at com.sun.mail.imap.protocol.IMAPProtocol.fetchBodyStructure(IMAPProtocol.java:1504)
at com.sun.mail.imap.IMAPMessage.loadBODYSTRUCTURE(IMAPMessage.java:1461)
at com.sun.mail.imap.IMAPMessage.getDataHandler(IMAPMessage.java:745)
at javax.mail.internet.MimeMessage.getContent(MimeMessage.java:1398)
at com.elgsys.elg.core.service.email.InboxHandlerServiceBean.checkInbox(InboxHandlerServiceBean.java:78)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85)
at com.haulmont.cuba.core.sys.ServiceInterceptor.aroundInvoke(ServiceInterceptor.java:117)
at sun.reflect.GeneratedMethodAccessor162.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:629)
at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:618)
at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
at com.sun.proxy.$Proxy161.checkInbox(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.haulmont.cuba.core.app.scheduling.RunnerBean.executeTask(RunnerBean.java:215)
at com.haulmont.cuba.core.app.scheduling.RunnerBean.lambda$runTask$0(RunnerBean.java:124)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Причина ошибки в том, что по какой-то причине код выхватывает класс из 1.5.4, а подсовывается версия из 1.5.0, поэтому NoSuchMethodError
А будет фикс для 6.10 или более поздних минорных релизов?
В 7.0 такой проблемы быть не должно, там сейчас версии по классам javax.mail и javaee-api одинаковые, в 7.1 постараемся удалить javaee-api из зависимостей.
В 6.10 постараемся исправить проблему, но пока трудно сказать сможем ли cделать.
В jetty сервера есть папка lib
, попробуйте туда поместить javaee-api. В этом случае у классов будет выше приоритет, возможно это поможет.
Я посмотрел класс ParameterList
, метод combineSegments
есть и в javaee-api и в javax.mail. Странно, что есть данная ошибка. Как будто этот класс есть еще в какой то другой jar.
Хотел уточнить тест-кейсы. У вас собирается single WAR? Проверяете на какой операционной системе Linux или Windows?
воспроизводится только по Linux (CentOS) и в Jetty App Server 9.4.12. Собираем в 2 war файла (app.war и app-core.war)
Руслан,
Спасибо за информацию. Удалось воспроизвести проблему.
Ошибка в данном случае не связана с дублированием классов в javaee-api-7.0.jar
и javax.mail-1.5.4.jar
. Причина проблемы в том, что в Jetty уже есть старая версия javax.mail в папке $jetty-home/lib/mail
.
Возможно только одно решение разместить в папке $jetty-base/lib/ext
библиотеку javax.mail-1.5.4.jar
. В этом случае должно все заработать.
Андрей, спасибо за решение вопроса. Попробуем
Ошибку нашли. Не доудалили, еще 1 jar файл был ошибочно выложен в lib/ext.
Вопрос закрываю. Спасибо за помощь