Comments (21)
https://stackoverflow.com/questions/30759522/spring-web-fragments-and-java-config looks promising
from phase4.
The SPI stuff should be easy to resolve.
You need to create a file META-INF/services/com.helger.phase4.peppol.servlet.IPhase4PeppolIncomingSBDHandlerSPI
that contains one line of text with the fully qualified name of the implementing class that implements this interface.
See https://docs.oracle.com/javase/tutorial/ext/basics/spi.html for the Oracle docs on it
from phase4.
Sweet! The problem is solved, you may close the issue :)
I would like to thank you for your response times and also for the reliable information!
from phase4.
Sure, when I wrap things up i'll send you the full demo.
from phase4.
Done via e-mail.
from phase4.
I tried to do a bit of research and managed to create a bean for the WebAppListener. Essentially what I did was base my springboot project from the subproject phase4-peppol-server-webapp and add the @ServletComponentScan to the main of the SpringBootApplication, however when I try to register the servlet I get this error:
The code I used to create the Servlet looks something like this:
Have you ever encountered anything like this?
Thanks in advance!
from phase4.
Yes I do :)
Try this class:
@Configuration
public class ServletConfig
{
/** The ServletContext to be used */
@Autowired
private ServletContext m_aSC;
@Bean
public ServletRegistrationBean <AS2ReceiveServlet> servletRegistrationBean ()
{
// Required to be called before the servlet is initialized
WebScopeManager.onGlobalBegin (m_aSC);
return new ServletRegistrationBean <> (new Phase4PeppolServlet (), "/as4");
}
}
and for the application try something like this
@SpringBootApplication
public class As4SandboxApplication
{
public static void main (final String [] args)
{
SpringApplication.run (As4SandboxApplication.class, args);
// Shutdown here
WebScopeManager.onGlobalEnd ();
}
}
from phase4.
That fixed part of the problem, now it says:
I assume the same ServletContext needs to be used both, for the Servlet and the Listener?
But it seems that it is trying to register a new one with the same name.
from phase4.
Yes correct. Can you post the full stack trace here?
Have you registered a ServletContectListener as well? If so, which one?
from phase4.
Stacktrace:
2021-02-16 16:13:49.404 INFO 9452 --- [ main] p.o.p.Phase4SpringbootApplication : Starting Phase4SpringbootApplication using Java 1.8.0_271 on OP-203 with PID 9452 (C:\Projects\phase4-phase4-parent-pom-0.14.0\phase4-springboot\target\classes started by Ghostuser in C:\Projects\phase4-phase4-parent-pom-0.14.0\phase4-springboot)
2021-02-16 16:13:49.411 INFO 9452 --- [ main] p.o.p.Phase4SpringbootApplication : No active profile set, falling back to default profiles: default
2021-02-16 16:13:51.765 INFO 9452 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-02-16 16:13:51.779 INFO 9452 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-02-16 16:13:51.779 INFO 9452 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41]
2021-02-16 16:13:52.037 INFO 9452 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-02-16 16:13:52.037 INFO 9452 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2449 ms
2021-02-16 16:13:52.660 ERROR 9452 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Exception sending context initialized event to listener instance of class [pt.opensoft.phase4springboot.server.servlet.Phase4PeppolWebAppListener]
java.lang.IllegalStateException: Another global scope with ID 'application' is already present. New global scope with ID 'application' is not set!
at com.helger.scope.mgr.ScopeManager.lambda$setGlobalScope$0(ScopeManager.java:102) ~[ph-scopes-9.5.4.jar:9.5.4]
at com.helger.commons.concurrent.SimpleReadWriteLock.writeLocked(SimpleReadWriteLock.java:341) ~[ph-commons-9.5.4.jar:9.5.4]
at com.helger.scope.mgr.ScopeManager.setGlobalScope(ScopeManager.java:97) ~[ph-scopes-9.5.4.jar:9.5.4]
at com.helger.web.scope.mgr.WebScopeManager.onGlobalBegin(WebScopeManager.java:148) ~[ph-web-9.5.2.jar:9.5.2]
at com.helger.web.scope.mgr.WebScopeManager.onGlobalBegin(WebScopeManager.java:140) ~[ph-web-9.5.2.jar:9.5.2]
at com.helger.photon.core.servlet.WebAppListener.contextInitialized(WebAppListener.java:652) ~[ph-oton-core-8.2.9.jar:8.2.9]
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4716) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5177) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) [tomcat-embed-core-9.0.41.jar:9.0.41]
at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) [na:1.8.0_271]
at java.util.concurrent.FutureTask.run(FutureTask.java) [na:1.8.0_271]
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-embed-core-9.0.41.jar:9.0.41]
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) [na:1.8.0_271]
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:843) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) [tomcat-embed-core-9.0.41.jar:9.0.41]
at java.util.concurrent.FutureTask.run$$$capture(FutureTask.java:266) [na:1.8.0_271]
at java.util.concurrent.FutureTask.run(FutureTask.java) [na:1.8.0_271]
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) [tomcat-embed-core-9.0.41.jar:9.0.41]
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) [na:1.8.0_271]
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:434) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.startup.Tomcat.start(Tomcat.java:486) [tomcat-embed-core-9.0.41.jar:9.0.41]
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:104) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:451) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:200) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:181) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:159) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:582) [spring-context-5.3.3.jar:5.3.3]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) [spring-boot-2.4.2.jar:2.4.2]
at pt.opensoft.phase4springboot.Phase4SpringbootApplication.main(Phase4SpringbootApplication.java:13) [classes/:na]
2021-02-16 16:13:52.661 ERROR 9452 --- [ main] o.apache.catalina.core.StandardContext : One or more listeners failed to start. Full details will be found in the appropriate container log file
2021-02-16 16:13:52.662 ERROR 9452 --- [ main] o.apache.catalina.core.StandardContext : Context [] startup failed due to previous errors
2021-02-16 16:13:52.666 INFO 9452 --- [ main] c.h.photon.core.servlet.WebAppListener : Servlet context 'application' is being destroyed
2021-02-16 16:13:52.689 ERROR 9452 --- [ main] c.h.photon.core.servlet.WebAppListener : Not writing statistics because WebFileIO was not initialized!
2021-02-16 16:13:52.722 INFO 9452 --- [ main] c.h.photon.core.servlet.WebAppListener : Servlet context 'application' was destroyed in 55 milli seconds
2021-02-16 16:13:53.228 INFO 9452 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2021-02-16 16:13:53.236 WARN 9452 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
2021-02-16 16:13:53.248 INFO 9452 --- [ main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-02-16 16:13:53.289 ERROR 9452 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:162) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:582) ~[spring-context-5.3.3.jar:5.3.3]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) [spring-boot-2.4.2.jar:2.4.2]
at pt.opensoft.phase4springboot.Phase4SpringbootApplication.main(Phase4SpringbootApplication.java:13) [classes/:na]
Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:142) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:104) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:451) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:200) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:181) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:159) ~[spring-boot-2.4.2.jar:2.4.2]
... 9 common frames omitted
Caused by: java.lang.IllegalStateException: StandardEngine[Tomcat].StandardHost[localhost].TomcatEmbeddedContext[] failed to start
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.rethrowDeferredStartupExceptions(TomcatWebServer.java:187) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:126) ~[spring-boot-2.4.2.jar:2.4.2]
... 14 common frames omitted
The listener I registered is the Phase4PeppolWebAppListener present in the peppol-server-web-app subproject.
from phase4.
Yes okay, so the other web fragments get loaded as well - than it's a matter of initialization order.
Can you paste the stacktrace that occurs if you don't do WebScopeManager.onGlobalBegin (m_aSC);
in your ServletConfig
?
from phase4.
Stack strace without WebScopeManager.onGlobalBegin (m_aSC);
:
2021-02-16 16:38:21.506 INFO 5604 --- [ main] p.o.p.Phase4SpringbootApplication : Starting Phase4SpringbootApplication using Java 1.8.0_271 on OP-203 with PID 5604 (C:\Projects\phase4-phase4-parent-pom-0.14.0\phase4-springboot\target\classes started by Ghostuser in C:\Projects\phase4-phase4-parent-pom-0.14.0\phase4-springboot)
2021-02-16 16:38:21.511 INFO 5604 --- [ main] p.o.p.Phase4SpringbootApplication : No active profile set, falling back to default profiles: default
2021-02-16 16:38:23.662 INFO 5604 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http)
2021-02-16 16:38:23.674 INFO 5604 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat]
2021-02-16 16:38:23.675 INFO 5604 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.41]
2021-02-16 16:38:23.958 INFO 5604 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext
2021-02-16 16:38:23.958 INFO 5604 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 2336 ms
2021-02-16 16:38:24.026 ERROR 5604 --- [ main] o.s.b.web.embedded.tomcat.TomcatStarter : Error starting Tomcat context. Exception: org.springframework.beans.factory.BeanCreationException. Message: Error creating bean with name 'servletRegistrationBean' defined in class path resource [pt/opensoft/phase4springboot/server/servlet/ServletConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.web.servlet.ServletRegistrationBean]: Factory method 'servletRegistrationBean' threw exception; nested exception is java.lang.IllegalStateException: No global scope object has been set!
2021-02-16 16:38:24.264 INFO 5604 --- [ main] com.helger.photon.app.io.WebFileIO : Using 'C:\Projects\phase4-phase4-parent-pom-0.14.0\phase4-springboot\phase4-data' as the data path
2021-02-16 16:38:24.270 INFO 5604 --- [ main] com.helger.photon.app.io.WebFileIO : Using 'C:\Users\Ghostuser\AppData\Local\Temp\tomcat-docbase.8080.3763512349173596853' as the servlet context path
2021-02-16 16:38:24.278 INFO 5604 --- [ main] c.helger.web.scope.mgr.WebScopeManager : Session passivation is now disabled
2021-02-16 16:38:24.291 INFO 5604 --- [ main] c.h.p.s.p.h.PasswordHashCreatorManager : Default PasswordHashCreator algorithm set to 'PBKDF2_1000_48'
2021-02-16 16:38:24.293 INFO 5604 --- [ main] c.h.p.s.password.GlobalPasswordSettings : Set global password constraints to [PasswordConstraintList@0x60921b21: constraints=[[PasswordConstraintMinLength@0x0bd2f5a9: minLength=6]]]
2021-02-16 16:38:24.300 INFO 5604 --- [ main] c.h.x.requesttrack.RequestTracker : RequestTrackerMonitor was installed successfully.
MailcapCommandMap: load HOME
new MailcapFile: file C:\Users\Ghostuser\.mailcap
MailcapCommandMap: load SYS
new MailcapFile: file C:\Program Files\Java\jdk1.8.0_271\jre\lib\mailcap
MailcapCommandMap: load JAR
MailcapCommandMap: getResources
MailcapCommandMap: URL jar:file:/C:/Users/Ghostuser/.m2/repository/org/bouncycastle/bcmail-jdk15on/1.67/bcmail-jdk15on-1.67.jar!/META-INF/mailcap
new MailcapFile: InputStream
parse: application/pkcs7-signature;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.pkcs7_signature
Type: application/pkcs7-signature
Command: content-handler, Class: org.bouncycastle.mail.smime.handlers.pkcs7_signature
parse: application/pkcs7-mime;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.pkcs7_mime
Type: application/pkcs7-mime
Command: content-handler, Class: org.bouncycastle.mail.smime.handlers.pkcs7_mime
parse: application/x-pkcs7-signature;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.x_pkcs7_signature
Type: application/x-pkcs7-signature
Command: content-handler, Class: org.bouncycastle.mail.smime.handlers.x_pkcs7_signature
parse: application/x-pkcs7-mime;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.x_pkcs7_mime
Type: application/x-pkcs7-mime
Command: content-handler, Class: org.bouncycastle.mail.smime.handlers.x_pkcs7_mime
parse: multipart/signed;; x-java-content-handler=org.bouncycastle.mail.smime.handlers.multipart_signed
Type: multipart/signed
Command: content-handler, Class: org.bouncycastle.mail.smime.handlers.multipart_signed
MailcapCommandMap: successfully loaded mailcap file from URL: jar:file:/C:/Users/Ghostuser/.m2/repository/org/bouncycastle/bcmail-jdk15on/1.67/bcmail-jdk15on-1.67.jar!/META-INF/mailcap
MailcapCommandMap: URL jar:file:/C:/Users/Ghostuser/.m2/repository/com/sun/mail/jakarta.mail/1.6.5/jakarta.mail-1.6.5.jar!/META-INF/mailcap
new MailcapFile: InputStream
parse: text/plain;; x-java-content-handler=com.sun.mail.handlers.text_plain
Type: text/plain
Command: content-handler, Class: com.sun.mail.handlers.text_plain
parse: text/html;; x-java-content-handler=com.sun.mail.handlers.text_html
Type: text/html
Command: content-handler, Class: com.sun.mail.handlers.text_html
parse: text/xml;; x-java-content-handler=com.sun.mail.handlers.text_xml
Type: text/xml
Command: content-handler, Class: com.sun.mail.handlers.text_xml
parse: multipart/*;; x-java-content-handler=com.sun.mail.handlers.multipart_mixed; x-java-fallback-entry=true
Type: multipart/*
Command: content-handler, Class: com.sun.mail.handlers.multipart_mixed
parse: message/rfc822;; x-java-content-handler=com.sun.mail.handlers.message_rfc822
Type: message/rfc822
Command: content-handler, Class: com.sun.mail.handlers.message_rfc822
MailcapCommandMap: successfully loaded mailcap file from URL: jar:file:/C:/Users/Ghostuser/.m2/repository/com/sun/mail/jakarta.mail/1.6.5/jakarta.mail-1.6.5.jar!/META-INF/mailcap
MailcapCommandMap: load DEF
new MailcapFile: InputStream
parse: image/gif;; x-java-view=com.sun.activation.viewers.ImageViewer
Type: image/gif
Command: view, Class: com.sun.activation.viewers.ImageViewer
parse: image/jpeg;; x-java-view=com.sun.activation.viewers.ImageViewer
Type: image/jpeg
Command: view, Class: com.sun.activation.viewers.ImageViewer
parse: text/*;; x-java-view=com.sun.activation.viewers.TextViewer
Type: text/*
Command: view, Class: com.sun.activation.viewers.TextViewer
parse: text/*;; x-java-edit=com.sun.activation.viewers.TextEditor
Type: text/*
Command: edit, Class: com.sun.activation.viewers.TextEditor
Merging commands for type text/*
MailcapCommandMap: successfully loaded mailcap file: /META-INF/mailcap.default
MailcapCommandMap: createDataContentHandler for multipart/related
search DB #1
search DB #2
search DB #3
search fallback DB #1
search fallback DB #2
got content-handler
class com.sun.mail.handlers.multipart_mixed
2021-02-16 16:38:24.857 INFO 5604 --- [ main] c.h.p.s.mgr.PhotonSecurityManager : PhotonSecurityManager was initialized
2021-02-16 16:38:24.859 INFO 5604 --- [ main] com.helger.phase4.mgr.MetaAS4Manager : MetaAS4Manager is initialized with in-memory data structures
2021-02-16 16:38:24.883 INFO 5604 --- [ main] c.h.phase4.profile.AS4ProfileManager : 1 AS4 profile is registered
2021-02-16 16:38:24.884 INFO 5604 --- [ main] com.helger.phase4.mgr.MetaAS4Manager : MetaAS4Manager was initialized
2021-02-16 16:38:24.928 INFO 5604 --- [ main] c.h.quartz.impl.StdSchedulerFactory : Using default implementation for ThreadExecutor
2021-02-16 16:38:24.930 INFO 5604 --- [ main] c.helger.quartz.simpl.SimpleThreadPool : Job execution threads will use class loader of thread: main
2021-02-16 16:38:24.932 INFO 5604 --- [ main] c.helger.quartz.simpl.SimpleThreadPool : Initialized 10 worker threads
2021-02-16 16:38:24.942 INFO 5604 --- [ main] c.h.quartz.core.QuartzSchedulerThread : QuartzSchedulerThread Inheriting ContextClassLoader of thread: main
2021-02-16 16:38:24.944 INFO 5604 --- [ main] c.helger.quartz.core.SchedulerSignaler : Initialized Scheduler Signaller of type: class com.helger.quartz.core.SchedulerSignaler
2021-02-16 16:38:24.944 INFO 5604 --- [ main] com.helger.quartz.core.QuartzScheduler : Mini Quartz Scheduler v.4.1.1 created.
2021-02-16 16:38:24.945 INFO 5604 --- [ main] com.helger.quartz.core.QuartzScheduler : JobFactory set to: com.helger.quartz.simpl.SimpleJobFactory@54d901aa
2021-02-16 16:38:24.945 INFO 5604 --- [ main] com.helger.quartz.simpl.RAMJobStore : RAMJobStore initialized.
2021-02-16 16:38:24.946 INFO 5604 --- [ main] com.helger.quartz.core.QuartzScheduler : Scheduler meta-data: Mini Quartz Scheduler (v4.1.1) 'MiniQuartzScheduler' with instanceId 'NON_CLUSTERED'
Scheduler class: 'com.helger.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'com.helger.quartz.simpl.SimpleThreadPool' - with 10 threads.
Using job-store 'com.helger.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.
2021-02-16 16:38:24.946 INFO 5604 --- [ main] c.h.quartz.impl.StdSchedulerFactory : Quartz scheduler 'MiniQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
2021-02-16 16:38:24.947 INFO 5604 --- [ main] c.h.quartz.impl.StdSchedulerFactory : Quartz scheduler version: 4.1.1
2021-02-16 16:38:24.948 INFO 5604 --- [ main] com.helger.quartz.core.QuartzScheduler : Scheduler MiniQuartzScheduler_$_NON_CLUSTERED started.
2021-02-16 16:38:24.958 INFO 5604 --- [ main] c.h.s.quartz.GlobalQuartzScheduler : Succesfully scheduled job 'AS4DuplicateCleanupJob-10' with TriggerKey DEFAULT.6da64b5bd2ee-2c6db8bb-26fe-4585-852e-84fff0f6fcd7 - starting at 2021-02-16T16:38:24.950
2021-02-16 16:38:24.983 INFO 5604 --- [ main] p.o.p.s.s.Phase4PeppolWebAppListener : Sucessfully checked that the provided Peppol AP certificate is valid.
2021-02-16 16:38:25.812 INFO 5604 --- [ main] p.o.p.s.s.Phase4PeppolWebAppListener : phase4 Peppol receiver checks are enabled
2021-02-16 16:38:25.813 INFO 5604 --- [ main] c.h.photon.core.servlet.WebAppListener : Servlet context 'application' was initialized in 1755 milli seconds
2021-02-16 16:38:25.821 INFO 5604 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat]
2021-02-16 16:38:25.825 INFO 5604 --- [ main] c.h.photon.core.servlet.WebAppListener : Servlet context 'application' is being destroyed
2021-02-16 16:38:25.826 INFO 5604 --- [ main] c.h.s.quartz.GlobalQuartzScheduler : Succesfully unscheduled job with TriggerKey DEFAULT.6da64b5bd2ee-2c6db8bb-26fe-4585-852e-84fff0f6fcd7
2021-02-16 16:38:25.828 INFO 5604 --- [ main] c.h.photon.audit.AsynchronousAuditor : Stopping auditor queue with 2 items
2021-02-16 16:38:26.566 INFO 5604 --- [ main] c.h.x.requesttrack.RequestTracker : RequestTrackerMonitor is now shutting down
2021-02-16 16:38:26.567 INFO 5604 --- [ main] c.h.x.requesttrack.RequestTracker : RequestTrackerMonitor was uninstalled successfully.
2021-02-16 16:38:26.567 INFO 5604 --- [ main] com.helger.quartz.core.QuartzScheduler : Scheduler MiniQuartzScheduler_$_NON_CLUSTERED shutting down.
2021-02-16 16:38:26.567 INFO 5604 --- [ main] com.helger.quartz.core.QuartzScheduler : Scheduler MiniQuartzScheduler_$_NON_CLUSTERED paused.
2021-02-16 16:38:26.981 INFO 5604 --- [ main] com.helger.quartz.core.QuartzScheduler : Scheduler MiniQuartzScheduler_$_NON_CLUSTERED shutdown complete.
2021-02-16 16:38:26.982 INFO 5604 --- [ main] c.h.s.quartz.GlobalQuartzScheduler : Successfully shutdown GlobalQuartzScheduler
2021-02-16 16:38:27.020 INFO 5604 --- [ main] c.h.photon.core.servlet.WebAppListener : Servlet context 'application' was destroyed in 1195 milli seconds
2021-02-16 16:38:27.024 WARN 5604 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
2021-02-16 16:38:27.032 INFO 5604 --- [ main] ConditionEvaluationReportLoggingListener :
Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2021-02-16 16:38:27.057 ERROR 5604 --- [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.context.ApplicationContextException: Unable to start web server; nested exception is org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:162) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:582) ~[spring-context-5.3.3.jar:5.3.3]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:144) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:767) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:426) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:326) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1311) [spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) [spring-boot-2.4.2.jar:2.4.2]
at pt.opensoft.phase4springboot.Phase4SpringbootApplication.main(Phase4SpringbootApplication.java:13) [classes/:na]
Caused by: org.springframework.boot.web.server.WebServerException: Unable to start embedded Tomcat
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:142) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.<init>(TomcatWebServer.java:104) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getTomcatWebServer(TomcatServletWebServerFactory.java:451) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory.getWebServer(TomcatServletWebServerFactory.java:200) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.createWebServer(ServletWebServerApplicationContext.java:181) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.onRefresh(ServletWebServerApplicationContext.java:159) ~[spring-boot-2.4.2.jar:2.4.2]
... 9 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'servletRegistrationBean' defined in class path resource [pt/opensoft/phase4springboot/server/servlet/ServletConfig.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.web.servlet.ServletRegistrationBean]: Factory method 'servletRegistrationBean' threw exception; nested exception is java.lang.IllegalStateException: No global scope object has been set!
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:658) ~[spring-beans-5.3.3.jar:5.3.3]
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:486) ~[spring-beans-5.3.3.jar:5.3.3]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1336) ~[spring-beans-5.3.3.jar:5.3.3]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1179) ~[spring-beans-5.3.3.jar:5.3.3]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:571) ~[spring-beans-5.3.3.jar:5.3.3]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:531) ~[spring-beans-5.3.3.jar:5.3.3]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.3.jar:5.3.3]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.3.jar:5.3.3]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.3.jar:5.3.3]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:213) ~[spring-beans-5.3.3.jar:5.3.3]
at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:212) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.servlet.ServletContextInitializerBeans.getOrderedBeansOfType(ServletContextInitializerBeans.java:203) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.servlet.ServletContextInitializerBeans.addServletContextInitializerBeans(ServletContextInitializerBeans.java:97) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.servlet.ServletContextInitializerBeans.<init>(ServletContextInitializerBeans.java:86) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.getServletContextInitializerBeans(ServletWebServerApplicationContext.java:259) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.selfInitialize(ServletWebServerApplicationContext.java:233) ~[spring-boot-2.4.2.jar:2.4.2]
at org.springframework.boot.web.embedded.tomcat.TomcatStarter.onStartup(TomcatStarter.java:53) ~[spring-boot-2.4.2.jar:2.4.2]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5166) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_271]
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) ~[na:1.8.0_271]
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:843) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1384) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1374) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_271]
at org.apache.tomcat.util.threads.InlineExecutorService.execute(InlineExecutorService.java:75) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at java.util.concurrent.AbstractExecutorService.submit(AbstractExecutorService.java:134) ~[na:1.8.0_271]
at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:909) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:262) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardService.startInternal(StandardService.java:434) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:930) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.apache.catalina.startup.Tomcat.start(Tomcat.java:486) ~[tomcat-embed-core-9.0.41.jar:9.0.41]
at org.springframework.boot.web.embedded.tomcat.TomcatWebServer.initialize(TomcatWebServer.java:123) ~[spring-boot-2.4.2.jar:2.4.2]
... 14 common frames omitted
Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.boot.web.servlet.ServletRegistrationBean]: Factory method 'servletRegistrationBean' threw exception; nested exception is java.lang.IllegalStateException: No global scope object has been set!
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:185) ~[spring-beans-5.3.3.jar:5.3.3]
at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:653) ~[spring-beans-5.3.3.jar:5.3.3]
... 54 common frames omitted
Caused by: java.lang.IllegalStateException: No global scope object has been set!
at com.helger.scope.mgr.ScopeManager.getGlobalScope(ScopeManager.java:159) ~[ph-scopes-9.5.4.jar:9.5.4]
at com.helger.scope.singleton.AbstractGlobalSingleton._getStaticScope(AbstractGlobalSingleton.java:48) ~[ph-scopes-9.5.4.jar:9.5.4]
at com.helger.scope.singleton.AbstractGlobalSingleton.getGlobalSingleton(AbstractGlobalSingleton.java:65) ~[ph-scopes-9.5.4.jar:9.5.4]
at com.helger.xservlet.servletstatus.ServletStatusManager.getInstance(ServletStatusManager.java:67) ~[ph-xservlet-9.5.2.jar:9.5.2]
at com.helger.xservlet.AbstractXServlet.<init>(AbstractXServlet.java:179) ~[ph-xservlet-9.5.2.jar:9.5.2]
at com.helger.phase4.peppol.servlet.Phase4PeppolServlet.<init>(Phase4PeppolServlet.java:49) ~[classes/:na]
at pt.opensoft.phase4springboot.server.servlet.ServletConfig.servletRegistrationBean(ServletConfig.java:24) ~[classes/:na]
at pt.opensoft.phase4springboot.server.servlet.ServletConfig$$EnhancerBySpringCGLIB$$9c7d7af6.CGLIB$servletRegistrationBean$0(<generated>) ~[classes/:na]
at pt.opensoft.phase4springboot.server.servlet.ServletConfig$$EnhancerBySpringCGLIB$$9c7d7af6$$FastClassBySpringCGLIB$$3c6c8e51.invoke(<generated>) ~[classes/:na]
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:244) ~[spring-core-5.3.3.jar:5.3.3]
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:331) ~[spring-context-5.3.3.jar:5.3.3]
at pt.opensoft.phase4springboot.server.servlet.ServletConfig$$EnhancerBySpringCGLIB$$9c7d7af6.servletRegistrationBean(<generated>) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_271]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_271]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_271]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_271]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:154) ~[spring-beans-5.3.3.jar:5.3.3]
... 55 common frames omitted
from phase4.
The problem is the initialization order. Unfortunately I am not a Spring Boot expert.
But I assume that Spring Boot also evaluates the WEB-INF/web.xml
file? Or does it only use what you configure?
Here we have the inconvenient case, that some "nested" WEB-INF/web-fragment.xml
are evaluated but there seems no "main" web.xml.
I hope you get my point ;-)
from phase4.
I might be wrong, but I think it doesn't rely on the web.xml file, when you programatically register the listener and the servlet.
If I manage to fix the problem I'll let you know.
Thanks for your help!
from phase4.
I managed to understand what I was doing wrong!
Spring Boot by default starts a Tomcat server, so we don't need the Web App Listener. Instead we just need to register the servlet as you suggested. The only problem i'm facing now is that it doesn't find the SBDHandlerSPI i'm providing.
from phase4.
Yes I think I managed to solve it. Thank you very much!
Just have one last question, the initialization that was being done in the Web App Listener now needs to be done before creating the servlet right?
Namely: WebScopeManager.onGlobalBegin(ctx); initGlobalSettings(); initAS4(); initPeppolAS4();
from phase4.
Yes, the WebScopeManager.onGlobalBegin needs to be the first.
It creates a small environment for "global variables" so that they can be shutdown appropriately in the end (closing files, deleting temp files etc.) without relying on external factors
from phase4.
Can you eventually share the stub project here so I can include it in the project? If so, do you agree that the code will be maintained under Apache 2.0 license?
from phase4.
Hey Philip, I finished setting up the demo stub and I would like to ask you what is the best way for me to share the code with you? Should I send you a zip with the code or leave it in a public repository under my name?
from phase4.
Whatever you prefer - if you have ZIP, feel free to send it by email.
If you already have a repository and can make a PR it also works for me.
I am trying not to be picky ;-)
from phase4.
Thanks a lot @jmrleal for providing this patch.
I've taken it basically "as is", just changed the namespaces and "not used" the InvoiceRegistry as it was too specific.
You are mentioned at https://github.com/phax/phase4#news-and-noteworthy and inside the NOTICE file of the submodule - I hope this is fine for you.
from phase4.
Related Issues (20)
- aProcessingErrorMessages in handleIncomingSBD HOT 6
- Sending to wildcard HOT 1
- aAPCertificate parameter in IPhase4PeppolCertificateCheckResultHandler is Nullable HOT 1
- Peppol Reporting missing C1 country code for incoming items HOT 1
- Receiving WildCard Error HOT 5
- DBNA profile HOT 2
- PMode.Leg[1].BusinessInfo.Service 'null' is unsupported HOT 12
- Enhancement request : make status of used version available via a status page or rest endpoint
- Idea: Add marks to log, so it is easier to read for human HOT 3
- Validating NRRs against sent or received messages HOT 1
- Sending Einvoice to SG ABN resulting in Invalid Certificate Error HOT 7
- Better AS4 error message when duplicate MessageId has been detected HOT 2
- Give access to the HTTP error response
- Provide a possibility to exclude stack traces from AS4 error messages HOT 1
- Not working with brainpool curve based encryption required for BDEW profile
- Bad Request: Error validating incoming AS4 UserMessage with the profile DBN Alliance following errors are present: [PMode.Leg[1].Security.X509EncryptionAlgorithm must use the value 'aes256-gcm' instead of 'aes128-gcm'] HOT 7
- Add DBNA pendant to phase4-peppol-servlet
- Trust anchor for certification path not found error for Incoming AS4 messages HOT 3
- Dynamically set responder address for incoming messages
- BDEW profile: Curve not supported: brainpoolP256r1 (1.3.36.3.3.2.8.1.1.7) HOT 4
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from phase4.