Javax.mail версии 1.5.4 и javaee-api-7.0.jar

Подскажите как можно исправить ситуацию? Мы используем 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"

Вроде работает.

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

1 симпатия

В нашем случаем мы используем 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

Завели тикет: https://github.com/cuba-platform/cuba/issues/1938

А будет фикс для 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.

1 симпатия

Хотел уточнить тест-кейсы. У вас собирается 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.
Вопрос закрываю. Спасибо за помощь :slight_smile:

1 симпатия