OHDSI Home | Forums | Wiki | Github

Issues with latest build of WebAPI and Embedded Tomcat Server

@alfranke, @cahilton:
I’ve managed to pull and rebase my updates to incorporate the version of WebAPI/cohortdefinition that’s pushed to github. Since the pull, however, things are not working in netbeans the way they used to, and maybe you could shed light on it.

At the core of my current problem, it is unable to find the JDBC driver that was placed in the tomcat folder which was installed on my system at:
C:\Program Files\Apache Software Foundation\Apache Tomcat 8.0.15\lib

Netbeans used to interop with this service and all was working well, but now i’m seeing information in the logs that lead me to believe that things are different now:

2015-01-30 15:16:47.319 INFO main org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer -  - Tomcat initialized with port(s): 8080 (http)
2015-01-30 15:16:47.569 INFO main org.apache.catalina.core.StandardService -  - Starting service Tomcat
2015-01-30 15:16:47.570 INFO main org.apache.catalina.core.StandardEngine -  - Starting Servlet Engine: Apache Tomcat/8.0.15

First thing that I noticed that is different is that Tomcat used to be served on port 8084. Now it appears that there’s an embedded instance that is trying to be hosted, but I don’t know where this embedded tomcat is installed from, nor how I can put the required external libraries into the path that should be available for any tomcat hosted app.

Can you explain the changes that were made in the most recent commits that makes it look like WebAPI is an application that embeds tomcat (and not the other way around where webAPI is a war that can be deployed into a web container)?

Also, if you could direct me to where the classpath that this embedded server uses so that I can put the jdbc drivers in a place that it will be found. Also, remeber, we’re not bundling jdbc drivers with webAPI, so it cant’ be placed into the POM dependencies.

-Chris

Hmmm, I don’t think we intended to add an embedded Tomcat to the WebAPI source. This may have been an accident. @cahilton or @alfranke, any ideas?

ps. Related to JDBC, I don’t know how those got there but I will sign the redistribution licenses so we can embed them at some point in something.

Jon, to be clear, we should not be embedding JDBC drivers with our apps. We can’t predict the number of db platforms that we’ll support, we don’t want to include every single jdbc driver of every possible platform within the web API project. The JDBC driver configuration is just a prerequisite, just like having a java compliant webserver and operating system, with memory and hard drive space. It’s the price of admission.

-Chris

Ok, so an update: if i start the Tomcat Service manually (found under the Services tab->Servers -> Apache Tomcat 8.0.15.0) the application behaves a bit differently. Instead of hosting a internal tomcat instance, it seems to know that it’s running in a container and just starts servicing requests (and at port 8084 which is what the tomcat service is configured to use). I won’t try to explain why it works (and I feel badly that I do not understand why it does not) but I’m able to run the service with the latest updates (and the abstractDAOservice that our services extends form is very nice).

If we can still investigate this ‘embedded mode’ that the project seems to run under, that might save some headaches for other people who faced the same issues I did…

-Chris

Spring boot was added during one of our first commits… Boot allows you to use an embedded tomcat server if you want to run the WebAPI as a java application, just like the Maven tomcat plugin also uses an embedded tomcat server (if you use that plugin to start a maven WAR project). Nothing has changed and you can also package the project as a WAR for deployment to a stand alone tomcat instance, which is what it sounds like you have been doing. I would think netbeans maven support is comparable to eclipse. The embedded tomcat dependency is ‘provided’ scope which means that it will be omitted during maven packaging. The embedded server uses classpath as defined by the dependencies of the project (Maven). So, I guess the question is why it is launching the embedded server… How do you launch it in Netbeans (e.g. run on server, etc.)?
Maven facilitates running applications and I advocate placing in dependencies (as optional and/or provided scope) into the pom (or profile) so that there is a cheaper price of admission (maven/java OR Eclipse).

End of log when running on Server

2015-01-30 16:42:40.121 INFO localhost-startStop-1 org.springframework.boot.SpringApplication -  - Started application in 6.629 seconds (JVM running for 18.707)
2015-01-30 16:42:40.153 INFO main org.apache.coyote.http11.Http11NioProtocol -  - Starting ProtocolHandler ["http-nio-8080"]
2015-01-30 16:42:40.162 INFO main org.apache.coyote.ajp.AjpNioProtocol -  - Starting ProtocolHandler ["ajp-nio-8009"]
2015-01-30 16:42:40.163 INFO main org.apache.catalina.startup.Catalina -  - Server startup in 15423 ms

End of log running as java application…

2015-01-30 16:59:37.345 INFO main org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer -  - Tomcat started on port(s): 8080 (http)
2015-01-30 16:59:37.346 INFO main org.ohdsi.webapi.WebApi -  - Started WebApi in 4.759 seconds (JVM running for 5.126)

Hey, Alex,
Yeah it is strange, and yeah, i got the SpringBoot banner in our logs for a while now, it was just since the latest commits (with the refactoring of the web service to an abstract base class for example) that I experienced this, and I thought some pom.xml updates were changed, so that’s why I thought it was related to that.

In Netbeans, you can just debug the WebAPI project, and it goes through the motions of deploying the web app, copying to the target, starting tomcat, firing off some URIs to deploy the app and reload, etc.

There were 2 things that were out of the ordinary when i pulled the latest changes:

1> the maven repo started downloading a lot more dependencies during the build process. I didn’t save the logs, but it felt like the entire depenency tree was being repulled.

2> When bulding it seemed to kick off some test validation which caused a spring boot process to kick off. In the past, i only saw spring boot fire once in the log was the applciation was starting up. But, while I was having the problems, springboot would announce itself in the logs multiple times before finally reporting that there was a failure to intialize due to a JDBC driver not found (I believe it had to do with he JDBC template trying to init).

I’ll keep an eye on it, see if I can narrow down how the project is launched based on if it’s a save-recompile-deploy thing or launch project in debug thing.

Thanks again.

-Chris

Ok, got it again. Here’s the log:

cd C:\Git\WebAPI; “JAVA_HOME=C:\Program Files\Java\jdk1.7.0_51” cmd /c “”“C:\Program Files\NetBeans 8.0.2\java\maven\bin\mvn.bat” -Dmaven.ext.class.path=“C:\Program Files\NetBeans 8.0.2\java\maven-nblib\netbeans-eventspy.jar” -Dfile.encoding=UTF-8 clean install""
Scanning for projects…

------------------------------------------------------------------------
Building WebAPI 1.0.0-SNAPSHOT
------------------------------------------------------------------------

--- maven-clean-plugin:2.4.1:clean (default-clean) @ WebAPI ---
Deleting C:\Git\WebAPI\target

--- maven-resources-plugin:2.5:resources (default-resources) @ WebAPI ---
[debug] execute contextualize
Using 'UTF-8' encoding to copy filtered resources.
Copying 1 resource
Copying 20 resources
Copying 1 resource
Copying 0 resource

--- maven-compiler-plugin:2.5.1:compile (default-compile) @ WebAPI ---
Compiling 41 source files to C:\Git\WebAPI\target\classes

--- maven-resources-plugin:2.5:testResources (default-testResources) @ WebAPI ---
[debug] execute contextualize
Using 'UTF-8' encoding to copy filtered resources.
Copying 1 resource

--- maven-compiler-plugin:2.5.1:testCompile (default-testCompile) @ WebAPI ---
Compiling 2 source files to C:\Git\WebAPI\target\test-classes

--- maven-surefire-plugin:2.10:test (default-test) @ WebAPI ---
Surefire report directory: C:\Git\WebAPI\target\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------

Results :

Tests run: 0, Failures: 0, Errors: 0, Skipped: 0


--- maven-war-plugin:2.2:war (default-war) @ WebAPI ---
Packaging webapp
Assembling webapp [WebAPI] in [C:\Git\WebAPI\target\WebAPI]
Processing war project
Copying webapp resources [C:\Git\WebAPI\src\main\webapp]
Webapp assembled in [2855 msecs]
Building war: C:\Git\WebAPI\target\WebAPI.war

--- maven-failsafe-plugin:2.18.1:integration-test (failsafe-integration-tests) @ WebAPI ---
Failsafe report directory: C:\Git\WebAPI\target\failsafe-reports
file.encoding cannot be set as system property, use <argLine>-Dfile.encoding=...<argLine> instead

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
2015-01-30 17:23:37.133 INFO main org.springframework.test.context.web.WebTestContextBootstrapper -  - Using TestExecutionListeners: [org.springframework.boot.test.IntegrationTestPropertiesListener@71ebfc42, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@3bfe8b7c, org.springframework.test.context.support.DirtiesContextTestExecutionListener@447798a9, org.springframework.test.context.transaction.TransactionalTestExecutionListener@7c7a25d, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@43748ba8]
Running org.ohdsi.webapi.test.VocabularyServiceIT
2015-01-30 17:23:37.146 INFO main org.springframework.test.context.web.WebTestContextBootstrapper -  - Using TestExecutionListeners: [org.springframework.boot.test.IntegrationTestPropertiesListener@325d21ef, org.springframework.test.context.support.DependencyInjectionTestExecutionListener@5eebbe, org.springframework.test.context.support.DirtiesContextTestExecutionListener@57c70722, org.springframework.test.context.transaction.TransactionalTestExecutionListener@4ba57633, org.springframework.test.context.jdbc.SqlScriptsTestExecutionListener@5bf33511]

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.2.1.RELEASE)

2015-01-30 17:23:37.784 INFO main org.apache.maven.surefire.booter.ForkedBooter -  - Starting ForkedBooter v2.18.1 on WPRDUSPBXRHLG with PID 10780 (C:\Users\cknoll1\.m2\repository\org\apache\maven\surefire\surefire-booter\2.18.1\surefire-booter-2.18.1.jar started by cknoll1 in C:\Git\WebAPI)
2015-01-30 17:23:37.824 INFO main org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext -  - Refreshing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@73db12e6: startup date [Fri Jan 30 17:23:37 EST 2015]; root of context hierarchy
2015-01-30 17:23:38.657 INFO main org.springframework.beans.factory.support.DefaultListableBeanFactory -  - Overriding bean definition for bean 'beanNameViewResolver': replacing [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/ErrorMvcAutoConfiguration$WhitelabelErrorViewConfiguration.class]] with [Root bean: class [null]; scope=; abstract=false; lazyInit=false; autowireMode=3; dependencyCheck=0; autowireCandidate=true; primary=false; factoryBeanName=org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter; factoryMethodName=beanNameViewResolver; initMethodName=null; destroyMethodName=(inferred); defined in class path resource [org/springframework/boot/autoconfigure/web/WebMvcAutoConfiguration$WebMvcAutoConfigurationAdapter.class]]
2015-01-30 17:23:38.965 INFO main org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor -  - JSR-330 'javax.inject.Inject' annotation found and supported for autowiring
2015-01-30 17:23:39.033 INFO main org.hibernate.validator.internal.util.Version -  - HV000001: Hibernate Validator 5.1.3.Final
2015-01-30 17:23:39.162 INFO main org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker -  - Bean 'org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration' of type [class org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration$$EnhancerBySpringCGLIB$$172d9db8] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2015-01-30 17:23:39.183 INFO main org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker -  - Bean 'transactionAttributeSource' of type [class org.springframework.transaction.annotation.AnnotationTransactionAttributeSource] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2015-01-30 17:23:39.191 INFO main org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker -  - Bean 'transactionInterceptor' of type [class org.springframework.transaction.interceptor.TransactionInterceptor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2015-01-30 17:23:39.195 INFO main org.springframework.context.support.PostProcessorRegistrationDelegate$BeanPostProcessorChecker -  - Bean 'org.springframework.transaction.config.internalTransactionAdvisor' of type [class org.springframework.transaction.interceptor.BeanFactoryTransactionAttributeSourceAdvisor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2015-01-30 17:23:39.683 INFO main org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer -  - Tomcat initialized with port(s): 8080 (http)
2015-01-30 17:23:39.974 INFO main org.apache.catalina.core.StandardService -  - Starting service Tomcat
2015-01-30 17:23:39.976 INFO main org.apache.catalina.core.StandardEngine -  - Starting Servlet Engine: Apache Tomcat/8.0.15
2015-01-30 17:23:40.123 INFO localhost-startStop-1 org.apache.catalina.core.ContainerBase.[Tomcat].[localhost].[/WebAPI] -  - Initializing Spring embedded WebApplicationContext
2015-01-30 17:23:40.123 INFO localhost-startStop-1 org.springframework.web.context.ContextLoader -  - Root WebApplicationContext: initialization completed in 2301 ms
2015-01-30 17:23:40.792 INFO localhost-startStop-1 org.springframework.boot.context.embedded.FilterRegistrationBean -  - Mapping filter: 'characterEncodingFilter' to: [/*]
2015-01-30 17:23:40.793 INFO localhost-startStop-1 org.springframework.boot.context.embedded.FilterRegistrationBean -  - Mapping filter: 'requestContextFilter' to: [/*]
2015-01-30 17:23:40.793 INFO localhost-startStop-1 org.springframework.boot.context.embedded.FilterRegistrationBean -  - Mapping filter: 'hiddenHttpMethodFilter' to: [/*]
2015-01-30 17:23:40.793 INFO localhost-startStop-1 org.springframework.boot.context.embedded.ServletRegistrationBean -  - Mapping servlet: 'jerseyServlet' to [/*]
2015-01-30 17:23:40.795 INFO localhost-startStop-1 org.springframework.boot.context.embedded.ServletRegistrationBean -  - Mapping servlet: 'dispatcherServlet' to [/]
2015-01-30 17:23:40.890 WARN main org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext -  - Exception encountered during context initialization - cancelling refresh attempt
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cohortDefinitionService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.jdbc.core.JdbcTemplate org.ohdsi.webapi.service.AbstractDaoService.jdbcTemplate; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$JdbcTemplateConfiguration': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private javax.sql.DataSource org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration$JdbcTemplateConfiguration.dataSource; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [org/springframework/boot/autoconfigure/jdbc/DataSourceAutoConfiguration$NonEmbeddedConfiguration.class]: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [javax.sql.DataSource]: Factory method 'dataSource' threw exception; nested exception is java.lang.IllegalStateException: Cannot load driver class: com.microsoft.sqlserver.jdbc.SQLServerDriver
	at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessPropertyValues(AutowiredAnnotationBeanPostProcessor.java:334)

Notice that it has two TESTS sections, first one completes normally (we have no tests to run) but then it starts up again, and spring boot gets involved…I’m not sure what to make of it.

-Chris

The tests ending in *IT.java are integration tests and will boot up an embedded server to run through the tests (run via the maven failsafe plugin). If netbeans triggered any phase equal to or higher than integration-test (after package, so that would include ‘install’ or ‘deploy’ phases - which maybe you triggered or ran?), it could have launched these tests.
http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html

Yep, see my next post. If you want skip tests use -DskipTests, if you want to skip only integration tests use -DskipITs

It’s because you are running maven ‘install’

Ok, thanks Alex. I don’t run anything from cmd line, just taking the default actions that Netbeans sets up when you clean/build/compile, etc. I’ll look into how netbeans invokes maven tasks/goals based on the IDE actions and see if I can get more control over the build lifecycle in maven.

-Chris

I tried using netbeans this morning. Was able to easily import (open) existing maven project. When you “run” the project, it looks like it uses “mvn package”, which is more what I would have expected (vs install). When I right-clicked the project and clicked “build”, netbeans ran the “mvn install”.
Eclipse does not run ‘install’ on your behalf and I have come to prefer that behavior. It looks like you can configure netbeans (Right-click project->properties->Actions). If you want to keep the current maven goals, I would add “-DskipTests=true” to the “build” and “clean and build” actions. Netbeans has an “add” button and option to skipTests and it will add the property for you.

That’s exactly what I found too! Great minds… yes, so I’m skipping the tests for my builds, and when I want to do some regression/unit tests I can kick them off specifically.

Thanks for jumping into netbeans. I’m glad that the maven support in Eclipse and netbeans is decent so that we can use the IDE we’re most comfortable with.

-Chris

The OHDSI Jenkins CI WebAPI build project also needed to be updated to account for the added spring boot, so I updated it to specify “package” as the mvn goal. It successfully builds a war file without any error messages.

Lee, does that mean the latest push of webAPI is available at our public WebAPI host?

If so…that’s awesome. I have an application to send you that will make use of this new api function.

-Chris

Are you publishing artifacts to your artifact repository (i.e nexus)? If so, you’ll need to use ‘mvn deploy’. Typically, the CI server would run the tests to satisfy the state of the build, before deploying to nexus or the shared env. I would be glad to help you with the command needed to run against your dev cdm db (basically just passing in jdbc arguments as defined in the pom into the mvn command). If for some reason, you want to deploy to nexus without running the tests, just pass in -DskipTests

I believe Jenkens is serving as our CI platform, and so it’ll publish anything to the repository. @lee_evans has the skinny on that tho.

@alfranke I’m new to spring boot and you are the expert so I have a couple of questions.

I really like the flexibility of all the options to pass in parameters/config via command line args, application.properties files etc so the addition of spring boot is a great idea.

My questions are around the current organization of the pom.xml file.

Here are the two current deployment scenarios as I understand them:

  1. Create a fat jar file with Oracle jdbc support that can be run on the command line and launch an embedded tomcat server. I believe this is the scenario at Regenstrief and the current pom.xml file structure accommodates that scenario.

  2. Create a skinny jar file (war file) that can be launched on Amazon AWS in a docker container (the docker container already has a single tomcat image that is shared across all docker containers on the server so a fat binary containing all the tomcat server dependencies in each docker container would be counterproductive). It’s a subtle difference but I believe with the fat jar approach running in each docker container it would in general be able to support fewer application instances running on the same server compared to the current war and shared tomcat image docker approach. Currently the AWS docker containers are using a Postgresql jdbc database connection but it would be good to have the flexibility to use multiple jdbc databases. I guess in general there will be other scenarios where a war file is required. For example for end-users that have existing tomcat or other application servers already deployed.

Please correct me if I am wrong but it seems that the current configuration of the pom.xml file no longer supports the second scenario?

Reviewing the spring boot docs it appears that multiple build and run time scenarios can be accommodated by the use of spring profiles.

Can you re-factor the changes you made to the pom.xml file to create two profiles to fit both of the above two scenarios? For example currently the dependency for the embedded tomcat container is outside of any profile definition.

Then in the Jenkins CI server we would have the flexibility to have separate build jobs, one specifying the “war” profile in the build and the other one specifying the “command line” or “fat jar” profile. Both artifacts would then be deployed separately to our OHDSI Nexus repository.

Also, I believe that multiple spring profiles can be specified together on build and execution - is that correct? If so could we define additional profiles for each database so we could pass in a combination of say “commandline, oracle” or “war, postgresql” to maven or at run time? That would be cool.

Does the above make sense? I only read the spring boot docs for the first time last night. Does Spring boot have these capabilities to support the two scenarios we need?

The pom.xml packaging type is still ‘war’, so that is what is created when you run ‘mvn package’. In other words, it is not currently producing a fat jar. Spring boot allows you to run the WebAPI as a “java application” (e.g. java -cp dependency1.jar:dependency2.jar etc.). If ran via “java application” mode, an embedded tomcat server is used. If you note the “spring-boot-starter-tomcat” dependency in the pom has a scope=provided. This means that when packaged as a war, the embedded tomcat will not be included.
Here at Regenstrief, I may use the run-as java application spring boot option locally (e.g. if I don’t want to open eclipse and just run via command line). We have our CI server (was Hudson and now Bamboo), package the WAR (after running tests), deploy the WAR to our artifact repository, and then push out to a tomcat server somewhere (hot deploy).
Spring boot allows you to deploy within a container or as a stand alone java application.

Currently, the pom.xml supports the WAR (default) and also supports running the application stand alone via Maven spring boot plugin (just committed a change that improves this particular usage - examples below).
For example:

mvn clean spring-boot:run -Pwebapi-oracle -Dspring.datasource.url=jdbc:oracle:thin:USER/PASS\@172.31.80.28:1521:i2b2idp

From CI, you likely want to do ‘mvn clean verify’ (includes integration tests and packaging). This would produce a WAR file which you could then push to a hosted tomcat.
For example:

 mvn clean verify -Pwebapi-oracle -Dspring.datasource.url=jdbc:oracle:thin:USER/PASS\@172.31.80.28:1521:i2b2idp

The above options filter the application.properties file that is included in the packaged WAR. Alternatively, you could set up your tomcat instance somewhere to specify an external properties file so that you can package your WAR w/o passwords and other sensitive values. This is more in line with best practices.

Stand alone:

mvn clean spring-boot:run -Pwebapi-oracle -Dspring.config.location=/etc/application.properties 

Tomcat - add to JAVA_OPTS. When CI pushes the WAR, spring will use the external properties for resolution.

-Dspring.config.location=/etc/application.properties 

Note: the webapi-oracle profile is an example of how to include dependencies when a profile is activated. For jdbc drivers, we will have to follow this model if we want the option to run via command line (i.e. embedded server).

With that said, we could pursue the “fat jar” if needed (i.e. being able to run the packaged WAR with ‘java -jar WebAPI-exec.jar’). I gave this a try and ran into an issue with Jersey and FileNotFoundExceptions. We can pursue this if needed (configuration for the spring boot maven plugin “fat jar” packaging is currently commented out).

Awesome Alex. Thanks for the detailed explanation and the great examples. It’s a lot clearer for me now.

I’m not aware of any current requirement for a ‘fat jar’. This approach is great.

I’ll update the Jenkins CI build to use “mvn clean verify”.

Regarding the integration tests, We should (eventually) have webapi tests that will require database access. So the CI build will need to run the integration tests multiple times - once for each backend database type with different connection info. Therefore does it make sense to also create webapi-sqlserver and webapi-postgresql profiles to support that? I’m thinking we would have three mvn clean verify steps passing in -Pwebapi-oracle or -Pwebapi-sqlserver or -Pwebapi-postgresql respectively? The only complication is that we would only want to deploy if all three sets of tests passed successfully.

Please go ahead and merge your latest commit.

I’lll specify a postgresql jdbc connection when deploying the webapi to Tomcat on AWS with the postgresql database I have loaded with CDMV5. I’ll follow the best practice you described and use an external application.properties file for that.

t