Авторазвертывание войны с tomee

Я пытаюсь создать рабочую среду разработки, используя образ докера TomEE 8.0.4. Я упаковываю свой проект в войну со всеми зависимостями (теми, которые не поставляются с TomEE). Затем я копирую эту войну в каталог webapps в контейнере докера с помощью

docker cp app.war tomee-instance:/usr/local/tomee/webapps

Это дает мне эти журналы:

tomee-instance       | 14-Nov-2020 00:31:43.724 INFO [Catalina-utility-1] jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke Undeploying context [/app]
tomee-instance       | 14-Nov-2020 00:31:43.743 WARNING [Catalina-utility-1] com.sun.faces.config.ConfigureListener.contextDestroyed Unexpected state during contextDestroyed: no ConfigManager instance in current ServletContext but one is expected to exist.
tomee-instance       | 14-Nov-2020 00:31:43.765 INFO [Catalina-utility-1] org.apache.openejb.assembler.classic.Assembler.destroyApplication Undeploying app: /usr/local/tomee/webapps/app
tomee-instance       | 14-Nov-2020 00:31:43.773 INFO [Catalina-utility-1] org.apache.openejb.assembler.classic.Assembler.doResourceDestruction Closing DataSource: app/appDS
tomee-instance       | 14-Nov-2020 00:31:43.900 WARNING [Catalina-utility-1] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesJdbc The web application [app] registered the JDBC driver [org.postgresql.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
tomee-instance       | 14-Nov-2020 00:31:43.911 INFO [Catalina-utility-1] jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke Deploying web application archive [/usr/local/tomee/webapps/app.war]
tomee-instance       | 14-Nov-2020 00:31:43.911 INFO [Catalina-utility-1] org.apache.tomee.catalina.TomcatWebAppBuilder.init ------------------------- localhost -> /app
tomee-instance       | 14-Nov-2020 00:31:43.913 INFO [Catalina-utility-1] org.apache.openejb.util.JarExtractor.extract Extracting jar: /usr/local/tomee/webapps/app.war
tomee-instance       | 14-Nov-2020 00:31:43.938 INFO [Catalina-utility-1] org.apache.openejb.util.JarExtractor.extract Extracted path: /usr/local/tomee/webapps/app
tomee-instance       | 14-Nov-2020 00:31:43.941 WARNING [Catalina-utility-1] org.apache.tomcat.util.digester.SetPropertiesRule.begin Match [Context] failed to set property [cachingAllowed] to [false]
tomee-instance       | 14-Nov-2020 00:31:44.119 INFO [Catalina-utility-1] org.apache.openejb.config.ConfigurationFactory.configureApplication Configuring enterprise application: /usr/local/tomee/webapps/app
tomee-instance       | 14-Nov-2020 00:31:44.237 INFO [Catalina-utility-1] org.apache.openejb.config.ConfigurationFactory.configureService Configuring Service(id=app/appDS, type=Resource, provider-id=Default JDBC Database)
tomee-instance       | 14-Nov-2020 00:31:44.237 INFO [Catalina-utility-1] org.apache.openejb.assembler.classic.Assembler.createRecipe Creating Resource(id=app/appDS)
tomee-instance       | 14-Nov-2020 00:31:44.382 INFO [Catalina-utility-1] org.apache.openejb.config.AutoConfig.processResourceRef Auto-linking resource-ref 'openejb/Resource/app/appDS' in bean app.Comp1660470862 to Resource(id=app/appDS)
tomee-instance       | 14-Nov-2020 00:31:44.382 INFO [Catalina-utility-1] org.apache.openejb.config.AutoConfig.processResourceRef Auto-linking resource-ref 'openejb/Resource/appDS' in bean app.Comp1660470862 to Resource(id=app/appDS)
tomee-instance       | 14-Nov-2020 00:31:44.383 INFO [Catalina-utility-1] org.apache.openejb.config.AutoConfig.deploy Configuring PersistenceUnit(name=app-pu, provider=org.eclipse.persistence.jpa.PersistenceProvider)
tomee-instance       | 14-Nov-2020 00:31:44.384 INFO [Catalina-utility-1] org.apache.openejb.config.AutoConfig.setJtaDataSource Adjusting PersistenceUnit app-pu <jta-data-source> to Resource ID 'app/appDS' from 'null'
tomee-instance       | 14-Nov-2020 00:31:44.384 INFO [Catalina-utility-1] org.apache.openejb.config.AutoConfig.setNonJtaDataSource Adjusting PersistenceUnit app-pu <non-jta-data-source> to Resource ID 'app/appDSNonJta' from 'null'
tomee-instance       | 14-Nov-2020 00:31:44.387 INFO [Catalina-utility-1] org.apache.openejb.config.AppInfoBuilder.build Enterprise application "/usr/local/tomee/webapps/app" loaded.
tomee-instance       | 14-Nov-2020 00:31:44.387 INFO [Catalina-utility-1] org.apache.openejb.assembler.classic.Assembler.createApplication Assembling app: /usr/local/tomee/webapps/app

И затем одно исключение для каждого класса моей модели, что-то идентичное этому:

tomee-instance       | 14-Nov-2020 00:31:44.394 INFO [Catalina-utility-1] org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading Illegal access: this web application instance has been stopped already. Could not load [com.example.base.core.model.IdEntity_]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
tomee-instance       |    java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [com.example.base.core.model.IdEntity_]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.
tomee-instance       |            at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForResourceLoading(WebappClassLoaderBase.java:1385)
tomee-instance       |            at org.apache.catalina.loader.WebappClassLoaderBase.checkStateForClassLoading(WebappClassLoaderBase.java:1373)
tomee-instance       |            at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1226)
tomee-instance       |            at org.apache.tomee.catalina.TomEEWebappClassLoader.loadClass(TomEEWebappClassLoader.java:209)
tomee-instance       |            at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1188)
tomee-instance       |            at java.base/java.lang.Class.forName0(Native Method)
tomee-instance       |            at java.base/java.lang.Class.forName(Unknown Source)
tomee-instance       |            at org.eclipse.persistence.internal.helper.ConversionManager.convertObjectToClass(ConversionManager.java:461)
tomee-instance       |            at org.eclipse.persistence.internal.helper.ConversionManager.convertObject(ConversionManager.java:159)
tomee-instance       |            at org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform.convertObject(DatasourcePlatform.java:225)
tomee-instance       |            at org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.preInitializeCanonicalMetamodel(EntityManagerSetupImpl.java:3966)
tomee-instance       |            at org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactoryImpl(PersistenceProvider.java:384)
tomee-instance       |            at org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactory(PersistenceProvider.java:316)
tomee-instance       |            at org.apache.openejb.assembler.classic.EntityManagerFactoryCallable.call(EntityManagerFactoryCallable.java:112)
tomee-instance       |            at org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory.createDelegate(ReloadableEntityManagerFactory.java:134)
tomee-instance       |            at org.apache.openejb.assembler.classic.ReloadableEntityManagerFactory.<init>(ReloadableEntityManagerFactory.java:105)
tomee-instance       |            at org.apache.openejb.assembler.classic.PersistenceBuilder.createEntityManagerFactory(PersistenceBuilder.java:157)
tomee-instance       |            at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:924)
tomee-instance       |            at org.apache.openejb.assembler.classic.Assembler.createApplication(Assembler.java:759)
tomee-instance       |            at org.apache.tomee.catalina.TomcatWebAppBuilder.startInternal(TomcatWebAppBuilder.java:1309)
tomee-instance       |            at org.apache.tomee.catalina.TomcatWebAppBuilder.configureStart(TomcatWebAppBuilder.java:1131)
tomee-instance       |            at org.apache.tomee.catalina.GlobalListenerSupport.lifecycleEvent(GlobalListenerSupport.java:134)
tomee-instance       |            at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
tomee-instance       |            at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5044)
tomee-instance       |            at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183)
tomee-instance       |            at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:717)
tomee-instance       |            at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:690)
tomee-instance       |            at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:705)
tomee-instance       |            at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:978)
tomee-instance       |            at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1848)
tomee-instance       |            at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
tomee-instance       |            at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
tomee-instance       |            at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75)
tomee-instance       |            at java.base/java.util.concurrent.AbstractExecutorService.submit(Unknown Source)
tomee-instance       |            at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:773)
tomee-instance       |            at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:427)
tomee-instance       |            at org.apache.catalina.startup.HostConfig.check(HostConfig.java:1620)
tomee-instance       |            at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:305)
tomee-instance       |            at org.apache.catalina.util.LifecycleBase.fireLifecycleEvent(LifecycleBase.java:123)
tomee-instance       |            at org.apache.catalina.core.ContainerBase.backgroundProcess(ContainerBase.java:1151)
tomee-instance       |            at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1353)
tomee-instance       |            at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.processChildren(ContainerBase.java:1357)
tomee-instance       |            at org.apache.catalina.core.ContainerBase$ContainerBackgroundProcessor.run(ContainerBase.java:1335)
tomee-instance       |            at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
tomee-instance       |            at java.base/java.util.concurrent.FutureTask.runAndReset(Unknown Source)
tomee-instance       |            at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
tomee-instance       |            at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
tomee-instance       |            at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
tomee-instance       |            at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
tomee-instance       |            at java.base/java.lang.Thread.run(Unknown Source)

Затем, если я попытаюсь получить доступ к приложению с помощью браузера, у меня будет следующее:

java.lang.IllegalStateException: Illegal access: this web application instance has been stopped already. Could not load [java.lang.ref.PhantomReference]. The following stack trace is thrown for debugging purposes as well as to attempt to terminate the thread which caused the illegal access.

Это просто пример, потому что иногда я получаю это исключение, но когда оно пытается загрузить классы, связанные с PostgreSQL.

Если я перезапускаю контейнер (чего я стараюсь избегать из-за соображений времени), ошибок нет, и приложение работает так, как ожидалось.

Приложение context.xml выглядит следующим образом:

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/app" antiResourceLocking="false" cachingAllowed="false" reloadable="true" override="true" privileged="true" />

Проект представляет собой простой сервис JAX-RS, в котором нет ни EJB, ни таких фреймворков, как Spring.

Извините, если я в отчаянии, но документация TomEE не помогла. t помочь, и я не знаю, как продолжить.

Изменить: я поместил полный catalina.log после запуска контейнера и повторного развертывания приложения в pastebin, здесь. И тот же файл после выполнения некоторого запроса, пока страница с ошибкой не будет доставлена ​​здесь.


person Alfredo Tostón    schedule 14.11.2020    source источник
comment
Две мысли по этому поводу: 1. Сообщение об исключении во втором поле кажется продолжением ошибки, которая произошла раньше. Можете ли вы добавить (а) самое первое исключение, включая часть «Вызвано причиной», и (б) файл журнала контейнера tomee до копирования в него войны? 2. Я вижу, вы добавляете приложение после того, как контейнер уже создан и запущен. Вам определенно следует создать свой собственный Dockerfile и образ, чтобы вы могли добавить свою войну приложений до создания и запуска контейнера. Это также может помочь в решении вашей проблемы.   -  person Kekzpanda    schedule 02.02.2021
comment
Здравствуйте, в конце концов, спасибо за ответ. Что касается пункта (1), я только что поместил все журналы в pastebin, как я сказал в последнем отредактированном абзаце (теперь последний). В (2) я слышал, что люди перестраивают весь образ при каждом развертывании. Я пытаюсь избежать этого, чтобы сэкономить время разработки, но я намерен опубликовать приложение в управляемой мной среде докеров и назвать меня чудаком, но я бы предпочел не перестраивать весь образ. каждый раз, когда я развертываю. Кроме того, нельзя ли развернуть «на лету» физический сервер tomee? А если ответ отрицательный, то как и зачем докер-образ?   -  person Alfredo Tostón    schedule 03.02.2021
comment
Проблема связана не с TomEE, а с Tomcat. Это известная проблема, описанная здесь stackoverflow.com/a/41503819/5171182. А еще известно, что перезагрузка помогает, как и в вашем случае. Тем не менее, чистое решение без перезагрузки, объясненное в ответе, является гораздо более излишним, чем просто создание образа с самого начала. Твой выбор! :)   -  person Kekzpanda    schedule 08.02.2021