├── .github └── workflows │ └── maven.yml ├── .gitignore ├── .rultor.yml ├── README.md ├── cxf-spring-boot-starter-maven-plugin-integrationtest ├── pom.xml └── src │ └── test │ ├── java │ └── de │ │ └── codecentric │ │ └── cxf │ │ └── CxfSpringBootStarterMavenPluginIntegrationTest.java │ └── resources │ └── generation-test-project │ ├── pom.xml │ └── src │ └── main │ └── resources │ └── wsdl │ ├── Weather-Schemes │ ├── w3c-xmlmime-definition.xsd │ ├── weather-datatypes.xsd │ ├── weather-exception.xsd │ └── weather-general.xsd │ ├── Weather1.0.wsdl │ └── Weather1.0.xsd ├── cxf-spring-boot-starter-maven-plugin ├── pom.xml └── src │ ├── main │ ├── java │ │ └── de │ │ │ └── codecentric │ │ │ └── cxf │ │ │ └── BootCxfMojo.java │ └── resources │ │ └── META-INF │ │ └── m2e │ │ └── lifecycle-mapping-metadata.xml │ └── test │ ├── java │ └── de │ │ └── codecentric │ │ └── cxf │ │ └── BootCxfMojoTest.java │ └── resources │ └── wsdl │ ├── Weather-Schemes │ ├── w3c-xmlmime-definition.xsd │ ├── weather-datatypes.xsd │ ├── weather-exception.xsd │ └── weather-general.xsd │ ├── Weather1.0.wsdl │ └── Weather1.0.xsd ├── pom.xml ├── pubring.gpg.asc ├── renovate.json ├── secring.gpg.asc └── settings.xml.asc /.github/workflows/maven.yml: -------------------------------------------------------------------------------- 1 | name: github 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | strategy: 10 | matrix: 11 | java-version: [ 8, 11, 15 ] 12 | 13 | steps: 14 | - uses: actions/checkout@v2 15 | - uses: actions/setup-java@v1 16 | with: 17 | java-version: ${{ matrix.java-version }} 18 | - run: mvn -B install --no-transfer-progress --file pom.xml 19 | 20 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Package Files # 4 | *.jar 5 | *.war 6 | *.ear 7 | 8 | # Eclipse # 9 | .settings 10 | .project 11 | .classpath 12 | .studio 13 | target 14 | 15 | # Apple # 16 | .DS_Store 17 | 18 | # Intellij # 19 | .idea 20 | *.iml 21 | *.log 22 | 23 | # logback 24 | logback.out.xml -------------------------------------------------------------------------------- /.rultor.yml: -------------------------------------------------------------------------------- 1 | decrypt: 2 | settings.xml: "repo/settings.xml.asc" 3 | pubring.gpg: "repo/pubring.gpg.asc" 4 | secring.gpg: "repo/secring.gpg.asc" 5 | docker: 6 | image: "yegor256/java8" 7 | release: 8 | script: | 9 | mvn versions:set "-DnewVersion=${tag}" 10 | git commit -am "${tag}" 11 | mvn clean deploy -P central-deploy --settings /home/r/settings.xml -P cxf-spring-boot-starter-maven-plugin -DskipTests=true -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | cxf-spring-boot-starter-maven-plugin complementing cxf-spring-boot-starter 2 | ============================= 3 | [![Build Status](https://github.com/codecentric/cxf-spring-boot-starter-maven-plugin/workflows/github/badge.svg)](https://github.com/codecentric/cxf-spring-boot-starter-maven-plugin/actions) 4 | [![Maven Central](https://maven-badges.herokuapp.com/maven-central/de.codecentric/cxf-spring-boot-starter-maven-plugin/badge.svg)](https://maven-badges.herokuapp.com/maven-central/de.codecentric/cxf-spring-boot-starter-maven-plugin/) 5 | [![License](http://img.shields.io/:license-apache-blue.svg)](http://www.apache.org/licenses/LICENSE-2.0.html) 6 | [![renovateenabled](https://img.shields.io/badge/renovate-enabled-yellow)](https://renovatebot.com) 7 | [![versionjaxb](https://img.shields.io/badge/dynamic/xml?color=brightgreen&url=https://raw.githubusercontent.com/codecentric/cxf-spring-boot-starter-maven-plugin/master/cxf-spring-boot-starter-maven-plugin/pom.xml&query=%2F%2A%5Blocal-name%28%29%3D%27project%27%5D%2F%2A%5Blocal-name%28%29%3D%27properties%27%5D%2F%2A%5Blocal-name%28%29%3D%27jaxb.version%27%5D&label=org.glassfish.jaxb)](github.com/eclipse-ee4j/jaxb-ri) 8 | [![versionjaxws](https://img.shields.io/badge/dynamic/xml?color=brightgreen&url=https://raw.githubusercontent.com/codecentric/cxf-spring-boot-starter-maven-plugin/master/cxf-spring-boot-starter-maven-plugin/pom.xml&query=%2F%2A%5Blocal-name%28%29%3D%27project%27%5D%2F%2A%5Blocal-name%28%29%3D%27properties%27%5D%2F%2A%5Blocal-name%28%29%3D%27jaxws-ri.version%27%5D&label=com.sun.xml.ws.jaxws)](https://mvnrepository.com/artifact/com.sun.xml.ws/jaxws-rt) 9 | [![versionjava](https://img.shields.io/badge/jdk-8,_11,_15-brightgreen.svg?logo=java)](https://www.oracle.com/technetwork/java/javase/downloads/index.html) 10 | [![versionjaxws-maven-plugin](https://img.shields.io/badge/jaxws_maven_plugin-3.0.0-brightgreen.svg)](https://github.com/eclipse-ee4j/metro-jax-ws/tree/master/jaxws-ri/extras/jaxws-maven-plugin) 11 | [![versionspring](https://img.shields.io/badge/dynamic/xml?color=brightgreen&url=https://raw.githubusercontent.com/codecentric/cxf-spring-boot-starter-maven-plugin/master/cxf-spring-boot-starter-maven-plugin/pom.xml&query=%2F%2A%5Blocal-name%28%29%3D%27project%27%5D%2F%2A%5Blocal-name%28%29%3D%27properties%27%5D%2F%2A%5Blocal-name%28%29%3D%27spring.version%27%5D&label=spring)](https://spring.io/) 12 | 13 | 14 | While a spring-boot-starter like [cxf-spring-boot-starter] generally only serves as a Maven dependency, something that will be executed in the build-section is not delivered in such a way. But the generation of JAX-B Classfiles is a good candidate to run inside the build-process - so the resulting files aren´t checked into source control system. The configuration e.g. of the [jaxws-maven-plugin] is rather complex to work properly and one has to do some research, till all necessary configuration parameters are set properly ([something like this](https://github.com/jonashackt/soap-spring-boot-cxf/blob/master/pom.xml) has to be done - just have a look into the build section of the pom). 15 | 16 | ### Features include: 17 | 18 | * Generating all necessary Java-Classes using JAX-B from your WSDL/XSDs, complementing the [cxf-spring-boot-starter] 19 | * This also works for complex imports of many XSD files that inherit other XSDs themselves 20 | * The generated JAX-B Classfiles will be added to your projects classpath - ready to map & transform into whatever you want 21 | * Scanning your resource-Folder for the WSDL and configuring the jaxws-maven-plugin, so that non-absolute paths will be generated into @WebServiceClient-Class 22 | * Non-absolute paths will be generated into @WebService and @WebServiceClient-Classes (so that one can initialize the Apache CXF endpoint 100% contract-first) 23 | * Extract the targetNamespace from the WSDL, generate the SEI and WebServiceClient annotated classes package names from it & write it together with the project´s package name into a cxf-spring-boot-maven.properties to enable Complete automation of Endpoint initialization in the [cxf-spring-boot-starter](https://github.com/codecentric/cxf-spring-boot-starter) ([documentation here](https://github.com/codecentric/cxf-spring-boot-starter#complete-automation-of-endpoint-initialization)) 24 | * Plugin is Eclipse m2e compatible (see [stackoverflow:eclipse-m2e-lifecycle] and [https://wiki.eclipse.org/M2E_compatible_maven_plugins](https://wiki.eclipse.org/M2E_compatible_maven_plugins), so no Plugin execution not covered by lifecycle configuration”-Error should accur 25 | 26 | ### HowTo 27 | 28 | * Put your WSDL into some folder under __/src/main/resources/__ OR __/src/test/resources/__ - and add your XSDs, so they could be imported correct (relatively) 29 | * If you want to tweak your Namespace-Names, put a binding.xml into the same folder, where your WSDL resides 30 | * Add this plugin to your pom´s build-section: 31 | 32 | ``` 33 | 34 | 35 | 36 | de.codecentric 37 | cxf-spring-boot-starter-maven-plugin 38 | 2.3.0.RELEASE 39 | 40 | 41 | 42 | generate 43 | 44 | 45 | 46 | 47 | 48 | 49 | ``` 50 | 51 | 52 | * it will be executed, if you run a standard: 53 | 54 | ``` 55 | mvn clean generate-sources 56 | ``` 57 | 58 | (or directly): 59 | 60 | ``` 61 | mvn cxf-spring-boot-starter:generate 62 | ``` 63 | 64 | * The generated JAX-B Classfiles will be placed in target/generated-sources/wsdlimport 65 | 66 | 67 | ### Moved from "OLD" jaxb to "NEW" jaxb 68 | 69 | As you might noticed there is a lot going on in the Community effort to move JavaEE to JakartaEE from Oracle to Eclipse Foundation. 70 | 71 | One of the impacts for this project was that the JAX-B GitHub repo [github.com/javaee/jaxb-v2](https://github.com/javaee/jaxb-v2) was archived and a new GitHub repo [github.com/eclipse-ee4j/jaxb-ri](https://github.com/eclipse-ee4j/jaxb-ri) has been created. 72 | 73 | Therefore we also moved to the new dependencies inside our [pom.xml](pom.xml) - instead of using [the "OLD JAXB" with the `com.sun.xml.bind` Maven groupId](https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-xjc), we now use the ["NEW JAXB" with the `org.glassfish.jaxb` Maven groupId](https://mvnrepository.com/artifact/org.glassfish.jaxb/jaxb-xjc): 74 | 75 | ``` 76 | 78 | 79 | org.glassfish.jaxb 80 | jaxb-xjc 81 | ${jaxb-xjc.version} 82 | 83 | 84 | 85 | org.glassfish.jaxb 86 | jaxb-runtime 87 | ${jaxb.version} 88 | 89 | ``` 90 | 91 | 92 | 93 | ### JDK 11 support 94 | 95 | As of JDK11 many deprecated packages aren't distributed with the JDK anymore - including `javax.xml.ws` (JAX-WS) and `javax.xml.bind` (JAX-B) (see [this post](https://blog.viadee.de/jaxb-und-soap-in-java-11)). 96 | 97 | Therefore we add the JAX-WS runtime to our pom.xml: 98 | 99 | ``` 100 | 101 | 102 | com.sun.xml.ws 103 | jaxws-rt 104 | ${jaxws-ri.version} 105 | pom 106 | 107 | ``` 108 | 109 | Sadly the jaxws-maven-plugin [isn't JDK11 (nor JDK9) compatible](https://github.com/mojohaus/jaxws-maven-plugin/issues/54) atm! 110 | 111 | __BUT__: Thanks so much to [mickaelbaron](https://github.com/mojohaus/jaxws-maven-plugin/issues/54#issuecomment-434323813) for stating, that the [mojohaus/jaxws-maven-plugin](https://github.com/mojohaus/jaxws-maven-plugin) is just deprecated and moved silently to [eclipse-ee4j/metro-jax-ws/tree/master/jaxws-ri/extras/jaxws-maven-plugin](https://github.com/eclipse-ee4j/metro-jax-ws/tree/master/jaxws-ri/extras/jaxws-maven-plugin)!!! 112 | 113 | ``` 114 | plugin( 115 | groupId("com.sun.xml.ws"), 116 | artifactId("jaxws-maven-plugin"), 117 | version("2.3.2"), 118 | dependencies( 119 | dependency( 120 | "org.jvnet.jaxb2_commons", 121 | "jaxb2-namespace-prefix", 122 | "1.3")) 123 | ), 124 | ``` 125 | 126 | With this maintained version of [com.sun.xml.ws.jaxws-maven-plugin](https://mvnrepository.com/artifact/com.sun.xml.ws/jaxws-maven-plugin) we are also able to run on all major JDK versions like a charm! 127 | 128 | 129 | ##### Build on multiple JDKs locally 130 | 131 | On our local machine in most situations we only have one JDK installation. There are solutions like [jenv](https://www.jenv.be/), but as I really like Docker, we can also run our builds with it: 132 | 133 | ``` 134 | # OpenJDK 13 (latest version) 135 | docker run --rm -v "$PWD":/build/our/plugin -w /build/our/plugin maven:3-jdk-13 bash -c "mvn clean install" 136 | 137 | # OpenJDK 12 (latest version) 138 | docker run --rm -v "$PWD":/build/our/plugin -w /build/our/plugin maven:3-jdk-12 bash -c "mvn clean install" 139 | 140 | # OpenJDK 11 (latest version) 141 | docker run --rm -v "$PWD":/build/our/plugin -w /build/our/plugin maven:3-jdk-11 bash -c "mvn clean install" 142 | 143 | # OpenJDK 8 (latest version) 144 | docker run --rm -v "$PWD":/build/our/plugin -w /build/our/plugin maven:3-jdk-8 bash -c "mvn clean install" 145 | ``` 146 | 147 | ### Integration testing the plugin 148 | 149 | > When updating development/release version: don't forget to update [generation-test-project/pom.xml](cxf-spring-boot-starter-maven-plugin-integrationtest/src/test/resources/generation-test-project/pom.xml)! 150 | 151 | We want to avoid as many problems as possible, so we should also do integration tests for this plugin. 152 | 153 | The [docs about testing Maven plugins](https://maven.apache.org/plugin-developers/plugin-testing.html) under the headline `Integration/Functional testing` advice us to use the [org.apache.maven.shared.maven-verifier](https://mvnrepository.com/artifact/org.apache.maven.shared/maven-verifier) plugin (__NOT the standard__ [maven-verifier-plugin](https://maven.apache.org/plugins/maven-verifier-plugin/)!!!), mind the groupId): 154 | 155 | ``` 156 | 157 | org.apache.maven.shared 158 | maven-verifier 159 | 1.6 160 | test 161 | 162 | ``` 163 | 164 | With this dependency we're able to use test the plugin from within JUnit powered Testcases like [CxfSpringBootStarterMavenPluginIntegrationTest.class](cxf-spring-boot-starter-maven-plugin-integrationtest/src/test/java/de/codecentric/cxf/CxfSpringBootStarterMavenPluginIntegrationTest.java): 165 | 166 | ```java 167 | import org.apache.maven.it.VerificationException; 168 | import org.apache.maven.it.Verifier; 169 | import org.apache.maven.it.util.ResourceExtractor; 170 | import org.junit.Test; 171 | 172 | import java.io.File; 173 | import java.io.IOException; 174 | 175 | public class CxfSpringBootStarterMavenPluginIntegrationTest { 176 | 177 | @Test 178 | public void testJaxBandJaxWsClassfilesGenerationInclPluginProperties() throws IOException, VerificationException { 179 | 180 | // Given 181 | File generationTestProjectDir = ResourceExtractor.simpleExtractResources( getClass(), "/generation-test-project" ); 182 | Verifier verifier = new Verifier( generationTestProjectDir.getAbsolutePath() ); 183 | 184 | // When 185 | verifier.executeGoal( "generate-sources" ); 186 | 187 | // Then 188 | verifier.verifyErrorFreeLog(); 189 | } 190 | 191 | } 192 | ``` 193 | 194 | For more code examples on how to use the Verifier API, see [this blog post](https://blog.akquinet.de/2011/02/21/testing-maven-plugins-with-the-verifier-approach/). 195 | 196 | As you may notice, we need a example project `generation-test-project` with a working [pom.xml](cxf-spring-boot-starter-maven-plugin-integrationtest/src/test/resources/generation-test-project/pom.xml) inside `src/test/resources/generation-test-project`: 197 | 198 | ``` 199 | 200 | 202 | 4.0.0 203 | 204 | de.codecentric.soap 205 | generation-test-project 206 | 1.0.0-SNAPSHOT 207 | jar 208 | 209 | Project solely for integrationtesting the cxf-spring-boot-starter-maven-plugin 210 | 211 | 212 | UTF-8 213 | 1.8 214 | 215 | 216 | 217 | 218 | 219 | de.codecentric 220 | cxf-spring-boot-starter-maven-plugin 221 | 2.1.6-SNAPSHOT 222 | 223 | 224 | 225 | generate 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | ``` 235 | 236 | And we need to introduce a parent pom to the project - because before actually running the integration test with `org.apache.maven.shared.maven-verifier` we need to execute the full Maven lifecycle incl. `mvn install` for the standard `cxf-spring-boot-starter-maven-plugin` project. Otherwise we wouldn't have something to integration test - and the second Maven module build would fail! 237 | 238 | The parent [pom.xml](pom.xml) therefore has a `modules` section: 239 | 240 | ``` 241 | 242 | cxf-spring-boot-starter-maven-plugin 243 | cxf-spring-boot-starter-maven-plugin-integrationtest 244 | 245 | ``` 246 | 247 | Because we want to release this plugin to Maven central, all configuration needed there has also been placed into the parent pom.xml, which makes the plugin's pom.xml much more readable, since it only contains the configuration and dependencies really needed. 248 | 249 | ##### Handling the ArtifactResolutionException: Could not find artifact de.codecentric:cxf-spring-boot-starter-maven-plugin:jar:2.1.6-SNAPSHOT error 250 | 251 | There is one problem with the [org.apache.maven.shared.maven-verifier plugin](https://mvnrepository.com/artifact/org.apache.maven.shared/maven-verifier. When I first used the plugin, I got this error 252 | 253 | ``` 254 | [INFO] ------------< de.codecentric.soap:generation-test-project >------------- 255 | [INFO] Building generation-test-project 1.0.0-SNAPSHOT 256 | [INFO] --------------------------------[ jar ]--------------------------------- 257 | [WARNING] The POM for de.codecentric:cxf-spring-boot-starter-maven-plugin:jar:2.1.6-SNAPSHOT is missing, no dependency information available 258 | [INFO] ------------------------------------------------------------------------ 259 | [INFO] BUILD FAILURE 260 | [INFO] ------------------------------------------------------------------------ 261 | [INFO] Total time: 1.193 s 262 | [INFO] Finished at: 2019-06-19T15:19:36+02:00 263 | [INFO] ------------------------------------------------------------------------ 264 | [ERROR] Plugin de.codecentric:cxf-spring-boot-starter-maven-plugin:2.1.6-SNAPSHOT or one of its dependencies could not be resolved: Could not find artifact de.codecentric:cxf-spring-boot-starter-maven-plugin:jar:2.1.6-SNAPSHOT -> [Help 1] 265 | org.apache.maven.plugin.PluginResolutionException: Plugin de.codecentric:cxf-spring-boot-starter-maven-plugin:2.1.6-SNAPSHOT or one of its dependencies could not be resolved: Could not find artifact de.codecentric:cxf-spring-boot-starter-maven-plugin:jar:2.1.6-SNAPSHOT 266 | at org.apache.maven.plugin.internal.DefaultPluginDependenciesResolver.resolve (DefaultPluginDependenciesResolver.java:128) 267 | at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getPluginDescriptor (DefaultMavenPluginManager.java:182) 268 | at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getMojoDescriptor (DefaultMavenPluginManager.java:286) 269 | at org.apache.maven.plugin.DefaultBuildPluginManager.getMojoDescriptor (DefaultBuildPluginManager.java:244) 270 | at org.apache.maven.lifecycle.internal.DefaultLifecycleMappingDelegate.calculateLifecycleMappings (DefaultLifecycleMappingDelegate.java:116) 271 | at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateLifecycleMappings (DefaultLifecycleExecutionPlanCalculator.java:265) 272 | at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateMojoExecutions (DefaultLifecycleExecutionPlanCalculator.java:217) 273 | at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateExecutionPlan (DefaultLifecycleExecutionPlanCalculator.java:126) 274 | at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateExecutionPlan (DefaultLifecycleExecutionPlanCalculator.java:144) 275 | at org.apache.maven.lifecycle.internal.builder.BuilderCommon.resolveBuildPlan (BuilderCommon.java:97) 276 | at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:111) 277 | at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81) 278 | at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56) 279 | at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128) 280 | at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305) 281 | at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192) 282 | at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105) 283 | at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956) 284 | at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288) 285 | at org.apache.maven.cli.MavenCli.main (MavenCli.java:192) 286 | at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) 287 | at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) 288 | at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) 289 | at java.lang.reflect.Method.invoke (Method.java:567) 290 | at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282) 291 | at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225) 292 | at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406) 293 | at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347) 294 | Caused by: org.eclipse.aether.resolution.ArtifactResolutionException: Could not find artifact de.codecentric:cxf-spring-boot-starter-maven-plugin:jar:2.1.6-SNAPSHOT 295 | at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve (DefaultArtifactResolver.java:423) 296 | at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts (DefaultArtifactResolver.java:225) 297 | at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact (DefaultArtifactResolver.java:202) 298 | at org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveArtifact (DefaultRepositorySystem.java:257) 299 | at org.apache.maven.plugin.internal.DefaultPluginDependenciesResolver.resolve (DefaultPluginDependenciesResolver.java:124) 300 | at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getPluginDescriptor (DefaultMavenPluginManager.java:182) 301 | at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getMojoDescriptor (DefaultMavenPluginManager.java:286) 302 | at org.apache.maven.plugin.DefaultBuildPluginManager.getMojoDescriptor (DefaultBuildPluginManager.java:244) 303 | at org.apache.maven.lifecycle.internal.DefaultLifecycleMappingDelegate.calculateLifecycleMappings (DefaultLifecycleMappingDelegate.java:116) 304 | at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateLifecycleMappings (DefaultLifecycleExecutionPlanCalculator.java:265) 305 | at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateMojoExecutions (DefaultLifecycleExecutionPlanCalculator.java:217) 306 | at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateExecutionPlan (DefaultLifecycleExecutionPlanCalculator.java:126) 307 | at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateExecutionPlan (DefaultLifecycleExecutionPlanCalculator.java:144) 308 | at org.apache.maven.lifecycle.internal.builder.BuilderCommon.resolveBuildPlan (BuilderCommon.java:97) 309 | at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:111) 310 | at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81) 311 | at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56) 312 | at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128) 313 | at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305) 314 | at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192) 315 | at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105) 316 | at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956) 317 | at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288) 318 | at org.apache.maven.cli.MavenCli.main (MavenCli.java:192) 319 | at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) 320 | at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) 321 | at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) 322 | at java.lang.reflect.Method.invoke (Method.java:567) 323 | at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282) 324 | at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225) 325 | at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406) 326 | at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347) 327 | Caused by: org.eclipse.aether.transfer.ArtifactNotFoundException: Could not find artifact de.codecentric:cxf-spring-boot-starter-maven-plugin:jar:2.1.6-SNAPSHOT 328 | at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolve (DefaultArtifactResolver.java:413) 329 | at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifacts (DefaultArtifactResolver.java:225) 330 | at org.eclipse.aether.internal.impl.DefaultArtifactResolver.resolveArtifact (DefaultArtifactResolver.java:202) 331 | at org.eclipse.aether.internal.impl.DefaultRepositorySystem.resolveArtifact (DefaultRepositorySystem.java:257) 332 | at org.apache.maven.plugin.internal.DefaultPluginDependenciesResolver.resolve (DefaultPluginDependenciesResolver.java:124) 333 | at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getPluginDescriptor (DefaultMavenPluginManager.java:182) 334 | at org.apache.maven.plugin.internal.DefaultMavenPluginManager.getMojoDescriptor (DefaultMavenPluginManager.java:286) 335 | at org.apache.maven.plugin.DefaultBuildPluginManager.getMojoDescriptor (DefaultBuildPluginManager.java:244) 336 | at org.apache.maven.lifecycle.internal.DefaultLifecycleMappingDelegate.calculateLifecycleMappings (DefaultLifecycleMappingDelegate.java:116) 337 | at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateLifecycleMappings (DefaultLifecycleExecutionPlanCalculator.java:265) 338 | at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateMojoExecutions (DefaultLifecycleExecutionPlanCalculator.java:217) 339 | at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateExecutionPlan (DefaultLifecycleExecutionPlanCalculator.java:126) 340 | at org.apache.maven.lifecycle.internal.DefaultLifecycleExecutionPlanCalculator.calculateExecutionPlan (DefaultLifecycleExecutionPlanCalculator.java:144) 341 | at org.apache.maven.lifecycle.internal.builder.BuilderCommon.resolveBuildPlan (BuilderCommon.java:97) 342 | at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:111) 343 | at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject (LifecycleModuleBuilder.java:81) 344 | at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build (SingleThreadedBuilder.java:56) 345 | at org.apache.maven.lifecycle.internal.LifecycleStarter.execute (LifecycleStarter.java:128) 346 | at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:305) 347 | at org.apache.maven.DefaultMaven.doExecute (DefaultMaven.java:192) 348 | at org.apache.maven.DefaultMaven.execute (DefaultMaven.java:105) 349 | at org.apache.maven.cli.MavenCli.execute (MavenCli.java:956) 350 | at org.apache.maven.cli.MavenCli.doMain (MavenCli.java:288) 351 | at org.apache.maven.cli.MavenCli.main (MavenCli.java:192) 352 | at jdk.internal.reflect.NativeMethodAccessorImpl.invoke0 (Native Method) 353 | at jdk.internal.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) 354 | at jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) 355 | at java.lang.reflect.Method.invoke (Method.java:567) 356 | at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced (Launcher.java:282) 357 | at org.codehaus.plexus.classworlds.launcher.Launcher.launch (Launcher.java:225) 358 | at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode (Launcher.java:406) 359 | at org.codehaus.plexus.classworlds.launcher.Launcher.main (Launcher.java:347) 360 | [ERROR] 361 | [ERROR] Re-run Maven using the -X switch to enable full debug logging. 362 | [ERROR] 363 | [ERROR] For more information about the errors and possible solutions, please read the following articles: 364 | [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/PluginResolutionException 365 | 366 | at org.apache.maven.it.Verifier.executeGoals(Verifier.java:1369) 367 | at org.apache.maven.it.Verifier.executeGoal(Verifier.java:1254) 368 | at org.apache.maven.it.Verifier.executeGoal(Verifier.java:1248) 369 | at de.codecentric.cxf.CxfSpringBootStarterMavenPluginIntegrationTest.testJaxBandJaxWsClassfilesGenerationInclPluginProperties(CxfSpringBootStarterMavenPluginIntegrationTest.java:21) 370 | at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 371 | at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 372 | at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 373 | at java.base/java.lang.reflect.Method.invoke(Method.java:567) 374 | at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 375 | at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 376 | at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 377 | at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 378 | at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 379 | at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 380 | at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 381 | at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 382 | at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 383 | at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 384 | at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 385 | at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 386 | at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 387 | at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252) 388 | at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141) 389 | at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) 390 | at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 391 | at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 392 | at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 393 | at java.base/java.lang.reflect.Method.invoke(Method.java:567) 394 | at org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) 395 | at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) 396 | at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) 397 | at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) 398 | at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) 399 | 400 | 401 | Results : 402 | 403 | Tests in error: 404 | testJaxBandJaxWsClassfilesGenerationInclPluginProperties(de.codecentric.cxf.CxfSpringBootStarterMavenPluginIntegrationTest): Exit code was non-zero: 1; command line and log = (..) 405 | 406 | Tests run: 1, Failures: 0, Errors: 1, Skipped: 0 407 | 408 | [INFO] ------------------------------------------------------------------------ 409 | [INFO] Reactor Summary for cxf-spring-boot-starter-maven-plugin-reactor 2.1.6-SNAPSHOT: 410 | [INFO] 411 | [INFO] cxf-spring-boot-starter-maven-plugin-reactor ....... SUCCESS [ 0.589 s] 412 | [INFO] cxf-spring-boot-starter-maven-plugin ............... SUCCESS [ 4.294 s] 413 | [INFO] cxf-spring-boot-starter-maven-plugin-integrationtest FAILURE [ 2.959 s] 414 | [INFO] ------------------------------------------------------------------------ 415 | [INFO] BUILD FAILURE 416 | [INFO] ------------------------------------------------------------------------ 417 | [INFO] Total time: 8.017 s 418 | [INFO] Finished at: 2019-06-19T15:19:36+02:00 419 | [INFO] ------------------------------------------------------------------------ 420 | [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.12.4:test (default-test) on project cxf-spring-boot-starter-maven-plugin-integrationtest: There are test failures. 421 | ``` 422 | 423 | After some hours of digging into the problem, I finally went to the source code of the [Verifier.java](https://github.com/apache/maven-verifier/blob/master/src/main/java/org/apache/maven/shared/verifier/Verifier.java#L195): 424 | 425 | ``` 426 | private void findDefaultMavenHome() 427 | throws VerificationException 428 | { 429 | defaultClasspath = System.getProperty( "maven.bootclasspath" ); 430 | defaultClassworldConf = System.getProperty( "classworlds.conf" ); 431 | defaultMavenHome = System.getProperty( "maven.home" ); 432 | 433 | if ( defaultMavenHome == null ) 434 | { 435 | Properties envVars = CommandLineUtils.getSystemEnvVars(); 436 | defaultMavenHome = envVars.getProperty( "M2_HOME" ); 437 | } 438 | 439 | if ( defaultMavenHome == null ) 440 | { 441 | File f = new File( System.getProperty( "user.home" ), "m2" ); 442 | if ( new File( f, "bin/mvn" ).isFile() ) 443 | { 444 | defaultMavenHome = f.getAbsolutePath(); 445 | } 446 | } 447 | } 448 | ``` 449 | 450 | And there we are - if we havent set either `M2_HOME` or `maven.home`, the Verifier will place an ugly `${user.home)/m2` directory inside the `cxf-spring-boot-starter-maven-plugin-integrationtest` project folder and tries to download our pre-build `de.codecentric:cxf-spring-boot-starter-maven-plugin:jar:2.1.6-SNAPSHOT`, which isn't available on Maven central - since this was only build into our local Maven repository located under `$HOME/.m2/repository`. 451 | 452 | Finally the `README` of the [Maven plugin integration testing source](https://github.com/apache/maven-integration-testing) gave me the hint - we simply use a CLI parameter to set the correct Maven repository location: 453 | 454 | ``` 455 | mvn clean install -Dmaven.repo.local=$HOME/.m2/repository 456 | ``` 457 | 458 | __BUT:__ this means, we need to set this `-D` parameter every time we want to run our integration tests, which is quite nasty. Isn't there a way we could set this programmatically, since our tests aren't executable inside our IDEs otherwise. 459 | 460 | Looking into the the [Verifier source at line 137](https://github.com/apache/maven-verifier/blob/master/src/main/java/org/apache/maven/shared/verifier/Verifier.java#L137) we find out, that there are other constructors - e.g. one with a `settingsFile` parameter, where we can inject the current systems configuration (which mainly also inherits the maven repo path). So we initialize the `Verifier` with: 461 | 462 | ``` 463 | verifier = new Verifier( generationTestProjectDir.getAbsolutePath(), "$HOME/.m2/settings.xml"); 464 | ``` 465 | 466 | Now the tests should work also inside our IDEs and without setting the `-D` parameter. 467 | 468 | 469 | ##### Where's the log file? 470 | 471 | We configure the `Verifier` to name the log file like this: 472 | 473 | ``` 474 | verifier.setLogFileName("verifier-output.log"); 475 | ``` 476 | 477 | But where can I find this file? Have a look into `target/test-classes/yourTestProjectName`. In this plugin's case, the file is located in: 478 | 479 | ``` 480 | cxf-spring-boot-starter-maven-plugin/cxf-spring-boot-starter-maven-plugin-integrationtest/target/test-classes/generation-test-project/verifier-output.log 481 | ``` 482 | 483 | ##### Final testcase 484 | 485 | Now after all this our Testcase [CxfSpringBootStarterMavenPluginIntegrationTest.class](cxf-spring-boot-starter-maven-plugin-integrationtest/src/test/java/de/codecentric/cxf/CxfSpringBootStarterMavenPluginIntegrationTest.java) looks like: 486 | 487 | ```java 488 | package de.codecentric.cxf; 489 | 490 | import org.apache.maven.it.VerificationException; 491 | import org.apache.maven.it.Verifier; 492 | import org.apache.maven.it.util.ResourceExtractor; 493 | import org.junit.Before; 494 | import org.junit.Test; 495 | 496 | import java.io.File; 497 | import java.io.IOException; 498 | 499 | public class CxfSpringBootStarterMavenPluginIntegrationTest { 500 | 501 | private File generationTestProjectDir; 502 | private Verifier verifier; 503 | 504 | @Before 505 | public void setUp() throws IOException, VerificationException { 506 | // Given 507 | generationTestProjectDir = ResourceExtractor.simpleExtractResources( getClass(), "/generation-test-project" ); 508 | verifier = new Verifier( generationTestProjectDir.getAbsolutePath(), "$HOME/.m2/settings.xml"); 509 | verifier.setLogFileName("verifier-output.log"); 510 | } 511 | 512 | @Test 513 | public void plugin_output_should_look_good_in_log() throws VerificationException { 514 | 515 | // When 516 | verifier.executeGoal( "generate-sources" ); 517 | 518 | // Then 519 | verifier.verifyErrorFreeLog(); 520 | verifier.verifyTextInLog("CXF-BOOT-MAVEN-PLUGIN STEP 0: Scanning for WSDL file in src/main/resources"); 521 | verifier.verifyTextInLog("CXF-BOOT-MAVEN-PLUGIN STEP 1: Found .wsdl-File"); 522 | verifier.verifyTextInLog("CXF-BOOT-MAVEN-PLUGIN STEP 2: Generating JAX-B Classfiles."); 523 | verifier.verifyTextInLog("Processing: file:"); 524 | verifier.verifyTextInLog("jaxws:wsimport args: [-keep, -s, '"); 525 | verifier.verifyTextInLog("CXF-BOOT-MAVEN-PLUGIN setting relative wsdlLocation into @WebServiceClient:"); 526 | verifier.verifyTextInLog("CXF-BOOT-MAVEN-PLUGIN STEP 4: Guessing SEI implementation´s package name & injecting it into cxf-spring-boot-maven.properties for later Autodetection of Endpoints..."); 527 | verifier.verifyTextInLog("CXF-BOOT-MAVEN-PLUGIN STEP 5: Extracting targetNamespace from WSDL, generating packageName from it with com.sun.tools.xjc.api.XJC (see wsgen, WSImportTool and WSDLModeler at line 2312 of the JAXWSRI) and injecting it into cxf-spring-boot-maven.properties for later Autodetection of Endpoints..."); 528 | 529 | // Reset the streams before executing the verifier 530 | verifier.resetStreams(); 531 | } 532 | 533 | } 534 | ``` 535 | 536 | 537 | [cxf-spring-boot-starter]:https://github.com/codecentric/cxf-spring-boot-starter 538 | [jaxws-maven-plugin]:https://github.com/eclipse-ee4j/metro-jax-ws/tree/master/jaxws-ri/extras/jaxws-maven-plugin 539 | [mojo-executor]:https://github.com/TimMoore/mojo-executor 540 | [stackoverflow:eclipse-m2e-lifecycle]:http://stackoverflow.com/a/26447353/4964553 541 | [bipro.net]:https://www.bipro.net/ 542 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin-integrationtest/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | 5 | de.codecentric 6 | cxf-spring-boot-starter-maven-plugin-reactor 7 | 2.4.0-SNAPSHOT 8 | 9 | cxf-spring-boot-starter-maven-plugin-integrationtest 10 | Project solely for integrationtesting the cxf-spring-boot-starter-maven-plugin 11 | 12 | 13 | 1.8 14 | 15 | 16 | 5.12.0 17 | 1.8.0 18 | 19 | 20 | 21 | 22 | 23 | org.junit.jupiter 24 | junit-jupiter 25 | ${junit.version} 26 | test 27 | 28 | 29 | 30 | org.apache.maven.shared 31 | maven-verifier 32 | ${maven-verifier.version} 33 | test 34 | 35 | 36 | 37 | 38 | 39 | 40 | 42 | 43 | org.apache.maven.plugins 44 | maven-surefire-plugin 45 | 2.22.2 46 | 47 | 48 | 49 | maven-deploy-plugin 50 | 51 | true 52 | 53 | 54 | 55 | 56 | 57 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin-integrationtest/src/test/java/de/codecentric/cxf/CxfSpringBootStarterMavenPluginIntegrationTest.java: -------------------------------------------------------------------------------- 1 | package de.codecentric.cxf; 2 | 3 | import org.apache.maven.it.VerificationException; 4 | import org.apache.maven.it.Verifier; 5 | import org.apache.maven.it.util.ResourceExtractor; 6 | import org.junit.jupiter.api.BeforeEach; 7 | import org.junit.jupiter.api.Test; 8 | 9 | import java.io.File; 10 | import java.io.IOException; 11 | 12 | public class CxfSpringBootStarterMavenPluginIntegrationTest { 13 | 14 | private File generationTestProjectDir; 15 | private Verifier verifier; 16 | 17 | @BeforeEach 18 | public void setUp() throws IOException, VerificationException { 19 | // Given 20 | generationTestProjectDir = ResourceExtractor.simpleExtractResources( getClass(), "/generation-test-project" ); 21 | verifier = new Verifier( generationTestProjectDir.getAbsolutePath(), "$HOME/.m2/settings.xml"); 22 | verifier.setLogFileName("verifier-output.log"); 23 | } 24 | 25 | @Test 26 | public void plugin_output_should_look_good_in_log() throws VerificationException { 27 | 28 | // When 29 | verifier.executeGoal( "generate-sources" ); 30 | 31 | // Then 32 | verifier.verifyErrorFreeLog(); 33 | verifier.verifyTextInLog("CXF-BOOT-MAVEN-PLUGIN STEP 0: Scanning for WSDL file in src/main/resources"); 34 | verifier.verifyTextInLog("CXF-BOOT-MAVEN-PLUGIN STEP 1: Found .wsdl-File"); 35 | verifier.verifyTextInLog("CXF-BOOT-MAVEN-PLUGIN STEP 2: Generating JAX-B Classfiles."); 36 | verifier.verifyTextInLog("Processing: file:"); 37 | verifier.verifyTextInLog("jaxws:wsimport args: [-keep, -s, '"); 38 | verifier.verifyTextInLog("CXF-BOOT-MAVEN-PLUGIN setting relative wsdlLocation into @WebServiceClient:"); 39 | verifier.verifyTextInLog("CXF-BOOT-MAVEN-PLUGIN STEP 4: Guessing SEI implementation´s package name & injecting it into cxf-spring-boot-maven.properties for later Autodetection of Endpoints..."); 40 | verifier.verifyTextInLog("CXF-BOOT-MAVEN-PLUGIN STEP 5: Extracting targetNamespace from WSDL, generating packageName from it with com.sun.tools.xjc.api.XJC (see wsgen, WSImportTool and WSDLModeler at line 2312 of the JAXWSRI) and injecting it into cxf-spring-boot-maven.properties for later Autodetection of Endpoints..."); 41 | 42 | // Reset the streams before executing the verifier 43 | verifier.resetStreams(); 44 | } 45 | 46 | } -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin-integrationtest/src/test/resources/generation-test-project/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | de.codecentric.soap 7 | generation-test-project 8 | 1.0.0-SNAPSHOT 9 | jar 10 | 11 | Project solely for integrationtesting the cxf-spring-boot-starter-maven-plugin 12 | 13 | 14 | UTF-8 15 | 1.8 16 | 17 | 18 | 19 | 20 | 21 | de.codecentric 22 | cxf-spring-boot-starter-maven-plugin 23 | 2.4.0-SNAPSHOT 24 | 25 | 26 | 27 | generate 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin-integrationtest/src/test/resources/generation-test-project/src/main/resources/wsdl/Weather-Schemes/w3c-xmlmime-definition.xsd: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin-integrationtest/src/test/resources/generation-test-project/src/main/resources/wsdl/Weather-Schemes/weather-datatypes.xsd: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin-integrationtest/src/test/resources/generation-test-project/src/main/resources/wsdl/Weather-Schemes/weather-exception.xsd: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin-integrationtest/src/test/resources/generation-test-project/src/main/resources/wsdl/Weather-Schemes/weather-general.xsd: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin-integrationtest/src/test/resources/generation-test-project/src/main/resources/wsdl/Weather1.0.wsdl: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | Gets Information for each WeatherID 47 | 48 | 49 | 50 | 51 | 52 | Allows you to get your City Forecast Over the Next 7 Days, which is updated hourly. 53 | 54 | 55 | 56 | 57 | 58 | Allows you to get your City's Weather, which is updated hourly. 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin-integrationtest/src/test/resources/generation-test-project/src/main/resources/wsdl/Weather1.0.xsd: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 12 | 13 | 15 | 16 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | 5 | de.codecentric 6 | cxf-spring-boot-starter-maven-plugin-reactor 7 | 2.4.0-SNAPSHOT 8 | 9 | cxf-spring-boot-starter-maven-plugin 10 | cxf-spring-boot-starter-maven-plugin 11 | Maven plugin complementing the Boot starter for SOAP-Webservices with Apache CXF using JAX-WS & JAXB with Annotations only 12 | maven-plugin 13 | https://github.com/codecentric/cxf-spring-boot-starter-maven-plugin 14 | 15 | 16 | Apache License, Version 2.0 17 | http://opensource.org/licenses/Apache-2.0 18 | repo 19 | 20 | 21 | 22 | 23 | Jonas Hecht 24 | jonas.hecht@codecentric.de 25 | codecentric AG 26 | http://www.codecentric.de 27 | 28 | 29 | 30 | 31 | 1.8 32 | 1.8 33 | 1.8 34 | 35 | 36 | 2.8.0 37 | 3.11 38 | 5.3.39 39 | 3.0.2 40 | 3.0.0 41 | 2.3.1 42 | 3.15.1 43 | 3.15.1 44 | 3.9.9 45 | 46 | 47 | 5.12.0 48 | 2.2 49 | 50 | 51 | 52 | 53 | org.apache.maven 54 | maven-plugin-api 55 | ${maven-plugin-api.version} 56 | 57 | 58 | 59 | 60 | org.apache.maven.plugin-tools 61 | maven-plugin-annotations 62 | ${maven-plugin-annotations.version} 63 | provided 64 | 65 | 66 | 68 | 69 | org.twdata.maven 70 | mojo-executor 71 | ${mojo-executor.version} 72 | 73 | 74 | org.slf4j 75 | slf4j-simple 76 | 77 | 78 | 79 | 80 | 81 | commons-io 82 | commons-io 83 | ${commons-io.version} 84 | 85 | 86 | 87 | org.apache.commons 88 | commons-lang3 89 | ${commons-lang3.version} 90 | 91 | 92 | 94 | 95 | org.glassfish.jaxb 96 | jaxb-xjc 97 | ${jaxb.version} 98 | 99 | 100 | 101 | org.glassfish.jaxb 102 | jaxb-runtime 103 | ${jaxb.version} 104 | 105 | 106 | 107 | 108 | com.sun.xml.ws 109 | jaxws-rt 110 | ${jaxws-ri.version} 111 | pom 112 | 113 | 114 | 115 | 116 | org.junit.jupiter 117 | junit-jupiter 118 | ${junit.version} 119 | test 120 | 121 | 122 | 123 | org.hamcrest 124 | hamcrest 125 | ${hamcrest.version} 126 | test 127 | 128 | 129 | 130 | org.springframework 131 | spring-core 132 | ${spring.version} 133 | test 134 | 135 | 136 | 137 | 138 | 139 | 140 | 142 | 143 | org.apache.maven.plugins 144 | maven-surefire-plugin 145 | 2.22.2 146 | 147 | 148 | org.apache.maven.plugins 149 | maven-plugin-plugin 150 | ${maven-plugin-plugin.version} 151 | 152 | 153 | default-descriptor 154 | process-classes 155 | 156 | 157 | 158 | help-goal 159 | 160 | helpmojo 161 | 162 | 163 | 164 | 165 | 166 | 167 | 168 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin/src/main/java/de/codecentric/cxf/BootCxfMojo.java: -------------------------------------------------------------------------------- 1 | package de.codecentric.cxf; 2 | 3 | import com.sun.tools.xjc.api.XJC; 4 | import org.apache.commons.io.FileUtils; 5 | import org.apache.commons.lang3.StringUtils; 6 | import org.apache.maven.execution.MavenSession; 7 | import org.apache.maven.plugin.AbstractMojo; 8 | import org.apache.maven.plugin.BuildPluginManager; 9 | import org.apache.maven.plugin.MojoExecutionException; 10 | import org.apache.maven.plugins.annotations.Component; 11 | import org.apache.maven.plugins.annotations.LifecyclePhase; 12 | import org.apache.maven.plugins.annotations.Mojo; 13 | import org.apache.maven.plugins.annotations.Parameter; 14 | import org.apache.maven.project.MavenProject; 15 | 16 | import java.io.File; 17 | import java.io.IOException; 18 | import java.nio.charset.Charset; 19 | import java.util.Collection; 20 | import java.util.Optional; 21 | import java.util.regex.Matcher; 22 | import java.util.regex.Pattern; 23 | 24 | import static org.twdata.maven.mojoexecutor.MojoExecutor.*; 25 | 26 | @Mojo(name = "generate", defaultPhase=LifecyclePhase.GENERATE_SOURCES) 27 | public class BootCxfMojo extends AbstractMojo { 28 | 29 | private static final String GENERATED_SOURCES_TARGET_FOLDER = "target/generated-sources/wsdlimport"; 30 | private static final String TEST_GENERATED_SOURCES_TARGET_FOLDER = "target/test/generated-sources/wsdlimport"; 31 | 32 | private static final String WSDL_NOT_FOUND_ERROR_MESSAGE = ".wsdl-File not found - is it placed somewhere under /src/main/resources or /src/test/resources?"; 33 | private static final String LOG_PREFIX = "CXF-BOOT-MAVEN-PLUGIN "; 34 | public static final String CXF_SPRING_BOOT_MAVEN_PROPERTIES_FILE_NAME = "cxf-spring-boot-maven.properties"; 35 | public static final String SEI_IMPLEMENTATION_PACKAGE_NAME_KEY = "sei.implementation.package.name"; 36 | public static final String SEI_AND_WEB_SERVICE_CLIENT_PACKAGE_NAME_KEY = "sei.and.webserviceclient.package.name"; 37 | 38 | // (?<=targetNamespace=")[:./a-zA-Z0-9]+(?=") 39 | private static final String REGEX_FIND_TARGET_NAMESPACE_CONTENT = "(?<=targetNamespace=\")[:._/a-zA-Z0-9-]+(?=\")"; 40 | private static final String TARGET_NAMESPACE_COULDNT_BE_EXTRACTED = "targetNamespace could not be extracted from WSDL file."; 41 | 42 | 43 | @Parameter( defaultValue = "${project}", readonly = true ) 44 | private MavenProject mavenProject; 45 | 46 | @Parameter( defaultValue = "${session}", readonly = true ) 47 | private MavenSession mavenSession; 48 | 49 | @Component 50 | private BuildPluginManager pluginManager; 51 | 52 | public void execute() throws MojoExecutionException { 53 | 54 | logWithPrefix("STEP 0: Scanning for WSDL file in src/main/resources"); 55 | 56 | File wsdl = findWsdl(mavenProject.getBasedir()); 57 | String buildDirectory = mavenProject.getBuild().getOutputDirectory(); 58 | 59 | logWithPrefix("STEP 1: Found .wsdl-File: " + wsdl.getPath()); 60 | if(isWsdlLocatedInTestResources(wsdl)) { 61 | logWithPrefix("STEP 2: Generating JAX-B Classfiles for Test purpose."); 62 | generateJaxbClassFiles(wsdl, "wsimport-test", TEST_GENERATED_SOURCES_TARGET_FOLDER); 63 | 64 | logWithPrefix("STEP 3: Adding the generated Test-Java-Classes to project´s classpath..."); 65 | addGeneratedTestClasses2Cp(); 66 | 67 | } else if(isWsdlLocatedInMainResources(wsdl)) { 68 | logWithPrefix("STEP 2: Generating JAX-B Classfiles."); 69 | generateJaxbClassFiles(wsdl, "wsimport", GENERATED_SOURCES_TARGET_FOLDER); 70 | 71 | logWithPrefix("STEP 3: Adding the generated Java-Classes to project´s classpath..."); 72 | addGeneratedClasses2Cp(); 73 | } 74 | 75 | logWithPrefix("STEP 4: Guessing SEI implementation´s package name & injecting it into " + CXF_SPRING_BOOT_MAVEN_PROPERTIES_FILE_NAME + " for later Autodetection of Endpoints..."); 76 | // The first writer to cxf-spring-boot-maven.properties should clean the file of old entries 77 | // Otherwise just appending would lead to bogus properties 78 | cleanCxfSpringBootMavenProperties(buildDirectory); 79 | writeSeiImplementationPackageToCxfSpringBootMavenPropterties(buildDirectory, mavenProject.getGroupId()); 80 | 81 | logWithPrefix("STEP 5: Extracting targetNamespace from WSDL, generating packageName from it with com.sun.tools.xjc.api.XJC (see wsgen, WSImportTool and WSDLModeler at line 2312 of the JAXWSRI) and injecting it into " + CXF_SPRING_BOOT_MAVEN_PROPERTIES_FILE_NAME + " for later Autodetection of Endpoints..."); 82 | String targetNamespaceFromWsdl = readTargetNamespaceFromWsdl(readWsdlIntoString(wsdl)); 83 | String seiImplementationBasePackageName = generatePackageNameFromTargetNamespaceInWsdl(targetNamespaceFromWsdl); 84 | writeSeiAndWebServiceClientPackageToCxfSpringBootMavenPropterties(buildDirectory, seiImplementationBasePackageName); 85 | } 86 | 87 | private void generateJaxbClassFiles(File wsdl, String jaxwsMavenPluginGoal, String dir2PutGeneratedClassesIn) throws MojoExecutionException { 88 | executeMojo( 89 | /* 90 | * Generate Java-Classes inkl. JAXB-Bindings from WSDL & imported XSD 91 | * See Doku at http://www.mojohaus.org/jaxws-maven-plugin/ 92 | * 93 | * Attention: The project has been moved from codehaus to project metro in 2007: 94 | * https://jax-ws-commons.java.net/jaxws-maven-plugin/ and then back to codehaus 95 | * in 2015, where it is developed further: https://github.com/mojohaus/jaxws-maven-plugin 96 | * 97 | * From 2019/20 on the https://github.com/mojohaus/jaxws-maven-plugin is deprecated and moved to 98 | * https://github.com/eclipse-ee4j/metro-jax-ws/tree/master/jaxws-ri/extras/jaxws-maven-plugin 99 | */ 100 | plugin( 101 | groupId("com.sun.xml.ws"), 102 | artifactId("jaxws-maven-plugin"), 103 | version("3.0.0"), 104 | dependencies( 105 | dependency( 106 | "org.jvnet.jaxb2_commons", 107 | "jaxb2-namespace-prefix", 108 | "1.3")) 109 | ), 110 | goal(jaxwsMavenPluginGoal), 111 | configuration( 112 | /* 113 | * See http://www.mojohaus.org/jaxws-maven-plugin/wsimport-mojo.html 114 | */ 115 | element(name("wsdlDirectory"), wsdlPathWithoutFileName(wsdl)), 116 | /* 117 | * This is very useful to NOT generate something like 118 | * wsdlLocation = "file:/Users/myuser/devfolder/cxf-spring-boot-starter/src/test/resources/wsdl/Weather1.0.wsdl" 119 | * into the @WebServiceClient generated Class. This could break stuff, e.g. when u build on Jenkins 120 | * and then try to deploy on a Linux server, where the path is completely different 121 | */ 122 | element(name("wsdlLocation"), constructWsdlLocation(wsdl)), 123 | element(name("sourceDestDir"), dir2PutGeneratedClassesIn), 124 | /* 125 | * For accessing the imported schema, see https://netbeans.org/bugzilla/show_bug.cgi?id=241570 126 | */ 127 | element("vmArgs", 128 | element("vmArg", "-Djavax.xml.accessExternalSchema=all -Djavax.xml.accessExternalDTD=all")), 129 | /* 130 | * the binding.xml in the given directory is found automatically, 131 | * because the directory is scanned for '.xml'-Files 132 | */ 133 | element("bindingDirectory", wsdlPathWithoutFileName(wsdl)), 134 | /* 135 | * Arguments for JAXB2-Generator behind JAX-WS-Frontend 136 | */ 137 | element("args", 138 | element("arg", "-extension"), 139 | /* 140 | * Thats a tricky parameter: The first '-B' is for passing the following argument 141 | * to JAXB2-Generator the second is needed to generate the human readable Namespace- 142 | * Prefixes 143 | */ 144 | element("arg", "-B-Xnamespace-prefix")) 145 | ), 146 | executionEnvironment( 147 | mavenProject, 148 | mavenSession, 149 | pluginManager 150 | ) 151 | ); 152 | } 153 | 154 | 155 | private String constructWsdlLocation(File wsdl) throws MojoExecutionException { 156 | String wsdlLocation = "/" + wsdlFolderInResources(wsdl) + wsdlFileName(wsdl); 157 | logWithPrefix("setting relative wsdlLocation into @WebServiceClient: " + wsdlLocation); 158 | return wsdlLocation; 159 | } 160 | 161 | private boolean isWsdlLocatedInTestResources(File wsdl) throws MojoExecutionException { 162 | return StringUtils.contains(wsdl.getPath(), "/test/") || StringUtils.contains(wsdl.getPath(), "\\test\\"); 163 | } 164 | 165 | 166 | private boolean isWsdlLocatedInMainResources(File wsdl) throws MojoExecutionException { 167 | return StringUtils.contains(wsdl.getPath(), "/main/") || StringUtils.contains(wsdl.getPath(), "\\main\\"); 168 | } 169 | 170 | private String wsdlFileName(File wsdl) throws MojoExecutionException { 171 | return wsdl.getName(); 172 | } 173 | 174 | private String wsdlFolderInResources(File wsdl) { 175 | String folderAboveResourceDir = wsdlFileParentFolderName(wsdl, ""); 176 | return folderAboveResourceDir; 177 | } 178 | 179 | private String wsdlFileParentFolderName(File wsdl, String folderAboveResourceDir) { 180 | if(!"resources".equals(wsdl.getParentFile().getName())) { 181 | folderAboveResourceDir = wsdl.getParentFile().getName() + "/" + folderAboveResourceDir; 182 | return wsdlFileParentFolderName(wsdl.getParentFile(), folderAboveResourceDir); 183 | } else { 184 | return folderAboveResourceDir; 185 | } 186 | } 187 | 188 | private String wsdlPathWithoutFileName(File wsdl) throws MojoExecutionException { 189 | return wsdl.getParent(); 190 | } 191 | 192 | protected File findWsdl(File buildDirectory) throws MojoExecutionException { 193 | String[] extension = {"wsdl"}; 194 | Collection wsdls = FileUtils.listFiles(buildDirectory, extension, true); 195 | 196 | filterOutWsdlsInsideBuildOutputFolder(wsdls); 197 | 198 | Optional wsdl = wsdls.stream().findFirst(); 199 | 200 | if(wsdl.isPresent()) { 201 | return wsdl.get(); 202 | } else { 203 | throw new MojoExecutionException(WSDL_NOT_FOUND_ERROR_MESSAGE); 204 | } 205 | } 206 | 207 | private void filterOutWsdlsInsideBuildOutputFolder(Collection wsdls) { 208 | if(mavenProject != null) { 209 | String targetDirectory = mavenProject.getBuild().getOutputDirectory().replaceAll("classes$", ""); 210 | wsdls.removeIf(f -> f.getAbsolutePath().startsWith(targetDirectory)); 211 | } 212 | } 213 | 214 | private void addGeneratedClasses2Cp() throws MojoExecutionException { 215 | /* 216 | * Add the generated Java-Classes to classpath 217 | */ 218 | executeMojo( 219 | plugin( 220 | groupId("org.codehaus.mojo"), 221 | artifactId("build-helper-maven-plugin"), 222 | version("3.0.0") 223 | ), 224 | goal("add-source"), 225 | configuration( 226 | element("sources", 227 | element("source", GENERATED_SOURCES_TARGET_FOLDER)) 228 | ), 229 | executionEnvironment( 230 | mavenProject, 231 | mavenSession, 232 | pluginManager 233 | ) 234 | ); 235 | } 236 | 237 | private void addGeneratedTestClasses2Cp() throws MojoExecutionException { 238 | /* 239 | * Add the generated Java-Classes to classpath 240 | */ 241 | executeMojo( 242 | plugin( 243 | groupId("org.codehaus.mojo"), 244 | artifactId("build-helper-maven-plugin"), 245 | version("3.0.0") 246 | ), 247 | goal("add-test-source"), 248 | configuration( 249 | element("sources", 250 | element("source", TEST_GENERATED_SOURCES_TARGET_FOLDER)) 251 | ), 252 | executionEnvironment( 253 | mavenProject, 254 | mavenSession, 255 | pluginManager 256 | ) 257 | ); 258 | } 259 | 260 | private void logWithPrefix(String logMessage) { 261 | getLog().info(LOG_PREFIX + logMessage); 262 | } 263 | 264 | protected String readTargetNamespaceFromWsdl(String wsdl) throws MojoExecutionException { 265 | 266 | Matcher matcher = buildMatcher(wsdl, REGEX_FIND_TARGET_NAMESPACE_CONTENT); 267 | 268 | if (matcher.find()) { 269 | return matcher.group(0); 270 | } else { 271 | throw new MojoExecutionException(TARGET_NAMESPACE_COULDNT_BE_EXTRACTED); 272 | } 273 | } 274 | 275 | protected static String readWsdlIntoString(File wsdl) throws MojoExecutionException { 276 | try { 277 | return FileUtils.readFileToString(wsdl, Charset.defaultCharset()); 278 | } catch (IOException ioEx) { 279 | throw new MojoExecutionException("Problems in transforming WSDL File to String.", ioEx); 280 | } 281 | } 282 | 283 | private static Matcher buildMatcher(String string2SearchIn, String regex) { 284 | Pattern pattern = Pattern.compile(regex); 285 | return pattern.matcher(string2SearchIn); 286 | } 287 | 288 | protected String generatePackageNameFromTargetNamespaceInWsdl(String targetNamespaceFromWsdl) throws MojoExecutionException { 289 | /* 290 | * We need to use the same mechanism jaxws-maven-plugin, which itself uses WSimportTool of the JAXWS-RI implementation, 291 | * to obtain the package-Name from the WSDL file, where the classes are generated to. The WSDL´s targetNamespace is 292 | * used to generate the package name. If you have targetNamespace="http://www.codecentric.de/namespace/weatherservice/" 293 | * for example, your package will be de.codecentric.namespace.weatherservice. 294 | * The code is in WSDLModeler at line 2312: 295 | */ 296 | return XJC.getDefaultPackageName(targetNamespaceFromWsdl); 297 | } 298 | 299 | protected void writeSeiAndWebServiceClientPackageToCxfSpringBootMavenPropterties(String outputDirectory, String packageName) throws MojoExecutionException { 300 | writeCxfSpringBootMavenProperties(outputDirectory, SEI_AND_WEB_SERVICE_CLIENT_PACKAGE_NAME_KEY, packageName); 301 | } 302 | 303 | protected void writeSeiImplementationPackageToCxfSpringBootMavenPropterties(String outputDirectory, String packageName) throws MojoExecutionException { 304 | writeCxfSpringBootMavenProperties(outputDirectory, SEI_IMPLEMENTATION_PACKAGE_NAME_KEY, packageName); 305 | } 306 | 307 | protected void writeCxfSpringBootMavenProperties(String outputDirectory, String propertyKey, String packageName) throws MojoExecutionException { 308 | try { 309 | File cxfSpringBootMavenProperties = new File(outputDirectory + "/" + CXF_SPRING_BOOT_MAVEN_PROPERTIES_FILE_NAME); 310 | FileUtils.writeStringToFile(cxfSpringBootMavenProperties, propertyKey + "=" + packageName + "\n", Charset.defaultCharset(), true); 311 | 312 | } catch (IOException ioExc) { 313 | throw new MojoExecutionException("Could not inject packageName into " + CXF_SPRING_BOOT_MAVEN_PROPERTIES_FILE_NAME + "." + 314 | "Have you set the pom groupId correctly?", ioExc); 315 | } 316 | } 317 | 318 | public void cleanCxfSpringBootMavenProperties(String outputDirectory) throws MojoExecutionException { 319 | try { 320 | File cxfSpringBootMavenProperties = new File(outputDirectory + "/" + CXF_SPRING_BOOT_MAVEN_PROPERTIES_FILE_NAME); 321 | FileUtils.writeStringToFile(cxfSpringBootMavenProperties, "", Charset.defaultCharset()); 322 | 323 | } catch (IOException ioExc) { 324 | throw new MojoExecutionException("Could not clean " + CXF_SPRING_BOOT_MAVEN_PROPERTIES_FILE_NAME, ioExc); 325 | } 326 | } 327 | } 328 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin/src/main/resources/META-INF/m2e/lifecycle-mapping-metadata.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | generate 8 | 9 | 10 | 11 | 12 | true 13 | false 14 | 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin/src/test/java/de/codecentric/cxf/BootCxfMojoTest.java: -------------------------------------------------------------------------------- 1 | package de.codecentric.cxf; 2 | 3 | import org.apache.commons.io.FileUtils; 4 | import org.apache.maven.plugin.MojoExecutionException; 5 | import org.junit.jupiter.api.Test; 6 | import org.springframework.core.io.Resource; 7 | import org.springframework.core.io.support.PathMatchingResourcePatternResolver; 8 | 9 | import java.io.File; 10 | import java.io.FileNotFoundException; 11 | import java.io.IOException; 12 | import java.nio.charset.Charset; 13 | import java.util.Arrays; 14 | import java.util.Optional; 15 | 16 | import static de.codecentric.cxf.BootCxfMojo.readWsdlIntoString; 17 | import static org.hamcrest.MatcherAssert.assertThat; 18 | import static org.hamcrest.Matchers.containsString; 19 | import static org.junit.jupiter.api.Assertions.assertEquals; 20 | 21 | public class BootCxfMojoTest { 22 | 23 | private File weatherServiceWsdl = new File("src/test/resources/Weather1.0.wsdl"); 24 | 25 | private BootCxfMojo bootCxfMojo = new BootCxfMojo();; 26 | private File resourcesDirectory = new File("src/test/resources"); 27 | private String buildDirectory = new File("target/classes").getAbsolutePath(); 28 | 29 | @Test 30 | public void 31 | find_Wsdl_in_classpath() throws IOException, MojoExecutionException { 32 | 33 | File wsdl = bootCxfMojo.findWsdl(resourcesDirectory); 34 | 35 | assertEquals(weatherServiceWsdl.getName(), wsdl.getName()); 36 | } 37 | 38 | @Test public void 39 | read_target_namespace_from_Wsdl() throws MojoExecutionException { 40 | 41 | File wsdl = bootCxfMojo.findWsdl(resourcesDirectory); 42 | String targetNamespace = bootCxfMojo.readTargetNamespaceFromWsdl(readWsdlIntoString(wsdl)); 43 | 44 | assertEquals("http://www.codecentric.de/namespace/weatherservice/", targetNamespace); 45 | } 46 | 47 | @Test public void 48 | extract_correct_package_name_from_target_namespace_in_Wsdl() throws MojoExecutionException { 49 | 50 | File wsdl = bootCxfMojo.findWsdl(resourcesDirectory); 51 | String targetNamespace = bootCxfMojo.readTargetNamespaceFromWsdl(readWsdlIntoString(wsdl)); 52 | String packageName = bootCxfMojo.generatePackageNameFromTargetNamespaceInWsdl(targetNamespace); 53 | 54 | assertEquals("de.codecentric.namespace.weatherservice", packageName); 55 | } 56 | 57 | @Test public void 58 | extract_correct_package_name_from_target_namespace_containing_numbers_in_Wsdl() throws MojoExecutionException { 59 | 60 | String wsdl = "\n" + 61 | "\n" + 65 | ""; 66 | String targetNamespace = bootCxfMojo.readTargetNamespaceFromWsdl(wsdl); 67 | String packageName = bootCxfMojo.generatePackageNameFromTargetNamespaceInWsdl(targetNamespace); 68 | 69 | assertEquals("ch.abc.namespase.filsearch.v5", packageName); 70 | } 71 | 72 | @Test public void 73 | extract_correct_package_name_from_target_namespace_containing_dash_in_Wsdl() throws MojoExecutionException { 74 | 75 | String wsdl = "\n" + 76 | "\n" + 80 | ""; 81 | String targetNamespace = bootCxfMojo.readTargetNamespaceFromWsdl(wsdl); 82 | String packageName = bootCxfMojo.generatePackageNameFromTargetNamespaceInWsdl(targetNamespace); 83 | 84 | assertEquals("schemas.dynamics.microsoft.page.customers", packageName); 85 | } 86 | 87 | @Test public void 88 | extract_correct_package_name_from_target_namespace_containing_underscores_in_Wsdl() throws MojoExecutionException { 89 | 90 | String wsdl = "\n" + 91 | "\n" + 95 | ""; 96 | String targetNamespace = bootCxfMojo.readTargetNamespaceFromWsdl(wsdl); 97 | String packageName = bootCxfMojo.generatePackageNameFromTargetNamespaceInWsdl(targetNamespace); 98 | 99 | assertEquals("com.comarch.crm.tag.webservice_v26", packageName); 100 | } 101 | 102 | @Test public void 103 | does_write_cxfSpringBootMavenProperties() throws MojoExecutionException, IOException { 104 | 105 | bootCxfMojo.writeCxfSpringBootMavenProperties(buildDirectory, "foo.key", "foo.bar"); 106 | 107 | File cxfSpringBootMavenProperties = findCxfSpringBootMavenPropertiesInClasspath(); 108 | assertEquals(BootCxfMojo.CXF_SPRING_BOOT_MAVEN_PROPERTIES_FILE_NAME, cxfSpringBootMavenProperties.getName()); 109 | 110 | } 111 | 112 | @Test public void 113 | does_clean_cxfSpringBootMavenProperties() throws MojoExecutionException, IOException { 114 | 115 | bootCxfMojo.cleanCxfSpringBootMavenProperties(buildDirectory); 116 | 117 | String content = FileUtils.readFileToString(findCxfSpringBootMavenPropertiesInClasspath(), Charset.defaultCharset()); 118 | assertEquals(0, content.length()); 119 | } 120 | 121 | @Test public void 122 | does_write_Sei_And_WebServiceClient_packageName_into_cxfSpringBootMavenProperties_file() throws MojoExecutionException, IOException { 123 | 124 | String packageNameGeneratedFromTargetNamespace = "de.codecentric.namespace.weatherservice"; 125 | 126 | bootCxfMojo.writeSeiAndWebServiceClientPackageToCxfSpringBootMavenPropterties(buildDirectory, packageNameGeneratedFromTargetNamespace); 127 | 128 | String content = FileUtils.readFileToString(findCxfSpringBootMavenPropertiesInClasspath(), Charset.defaultCharset()); 129 | assertThat(content, containsString(BootCxfMojo.SEI_AND_WEB_SERVICE_CLIENT_PACKAGE_NAME_KEY + "=" + packageNameGeneratedFromTargetNamespace)); 130 | } 131 | 132 | 133 | @Test public void 134 | does_write_Sei_Implementation_packageName_into_cxfSpringBootMavenProperties_file() throws Exception { 135 | 136 | String seiImplementationPackageName = "de.codecentric.soap"; 137 | 138 | bootCxfMojo.writeSeiImplementationPackageToCxfSpringBootMavenPropterties(buildDirectory, seiImplementationPackageName); 139 | 140 | String content = FileUtils.readFileToString(findCxfSpringBootMavenPropertiesInClasspath(), Charset.defaultCharset()); 141 | assertThat(content, containsString(BootCxfMojo.SEI_IMPLEMENTATION_PACKAGE_NAME_KEY + "=" + seiImplementationPackageName)); 142 | } 143 | 144 | @Test public void 145 | does_not_overwrite_packages_in_cxfSpringBootMavenProperties_file() throws MojoExecutionException, IOException { 146 | bootCxfMojo.writeCxfSpringBootMavenProperties(buildDirectory, "foo.key", "foo.bar"); 147 | bootCxfMojo.writeCxfSpringBootMavenProperties(buildDirectory, "bar.key", "bar.boar"); 148 | 149 | String content = FileUtils.readFileToString(findCxfSpringBootMavenPropertiesInClasspath(), Charset.defaultCharset()); 150 | assertThat(content, containsString("foo.key" + "=" + "foo.bar")); 151 | assertThat(content, containsString("bar.key" + "=" + "bar.boar")); 152 | } 153 | 154 | private File findCxfSpringBootMavenPropertiesInClasspath() throws IOException { 155 | return findInClasspath("classpath*:**/" + BootCxfMojo.CXF_SPRING_BOOT_MAVEN_PROPERTIES_FILE_NAME).getFile(); 156 | } 157 | 158 | private Resource findInClasspath(String pattern) throws IOException { 159 | PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); 160 | 161 | Resource[] resources = resolver.getResources(pattern); 162 | 163 | Optional first = Arrays.stream(resources).findFirst(); 164 | 165 | if(first.isPresent()) { 166 | return first.get(); 167 | } else { 168 | throw new FileNotFoundException(); 169 | } 170 | } 171 | 172 | } -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin/src/test/resources/wsdl/Weather-Schemes/w3c-xmlmime-definition.xsd: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin/src/test/resources/wsdl/Weather-Schemes/weather-datatypes.xsd: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin/src/test/resources/wsdl/Weather-Schemes/weather-exception.xsd: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin/src/test/resources/wsdl/Weather-Schemes/weather-general.xsd: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin/src/test/resources/wsdl/Weather1.0.wsdl: -------------------------------------------------------------------------------- 1 | 2 | 14 | 15 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | Gets Information for each WeatherID 47 | 48 | 49 | 50 | 51 | 52 | Allows you to get your City Forecast Over the Next 7 Days, which is updated hourly. 53 | 54 | 55 | 56 | 57 | 58 | Allows you to get your City's Weather, which is updated hourly. 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /cxf-spring-boot-starter-maven-plugin/src/test/resources/wsdl/Weather1.0.xsd: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 12 | 13 | 15 | 16 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4.0.0 4 | de.codecentric 5 | cxf-spring-boot-starter-maven-plugin-reactor 6 | cxf-spring-boot-starter-maven-plugin-reactor 7 | 2.4.0-SNAPSHOT 8 | 9 | Reactor Maven project for the cxf-spring-boot-starter-maven-plugin 10 | pom 11 | https://github.com/codecentric/cxf-spring-boot-starter-maven-plugin 12 | 13 | 14 | Apache License, Version 2.0 15 | http://opensource.org/licenses/Apache-2.0 16 | repo 17 | 18 | 19 | 20 | 21 | Jonas Hecht 22 | jonas.hecht@codecentric.de 23 | codecentric AG 24 | http://www.codecentric.de 25 | 26 | 27 | 28 | scm:git:git://github.com/codecentric/cxf-spring-boot-starter-maven-plugin.git 29 | scm:git:ssh://git@github.com/codecentric/cxf-spring-boot-starter-maven-plugin.git 30 | git@github.com:/codecentric/cxf-spring-boot-starter-maven-plugin.git 31 | 32 | 33 | 34 | oss.sonatype.org 35 | https://oss.sonatype.org/service/local/staging/deploy/maven2/ 36 | 37 | 38 | oss.sonatype.org 39 | https://oss.sonatype.org/content/repositories/snapshots 40 | 41 | 42 | 43 | 44 | cxf-spring-boot-starter-maven-plugin 45 | cxf-spring-boot-starter-maven-plugin-integrationtest 46 | 47 | 48 | 49 | 1.8 50 | 1.8 51 | 1.8 52 | 53 | 54 | 2.18.0 55 | 1.6 56 | 3.3.1 57 | 3.11.2 58 | 1.6.8 59 | 60 | 61 | 62 | 63 | 64 | central-deploy 65 | 66 | 67 | 68 | maven-gpg-plugin 69 | ${maven-gpg-plugin.version} 70 | 71 | 72 | sign-artifacts 73 | verify 74 | 75 | sign 76 | 77 | 78 | 79 | 80 | 81 | org.codehaus.mojo 82 | versions-maven-plugin 83 | ${versions-maven-plugin.version} 84 | 85 | false 86 | 87 | 88 | 89 | maven-deploy-plugin 90 | 91 | true 92 | 93 | 94 | 95 | org.apache.maven.plugins 96 | maven-source-plugin 97 | ${maven-source-plugin.version} 98 | 99 | 100 | attach-sources 101 | 102 | jar 103 | 104 | 105 | 106 | 107 | 108 | org.apache.maven.plugins 109 | maven-javadoc-plugin 110 | ${maven-javadoc-plugin.version} 111 | 112 | 113 | attach-javadocs 114 | 115 | jar 116 | 117 | 118 | 119 | 120 | 121 | org.sonatype.plugins 122 | nexus-staging-maven-plugin 123 | ${nexus-staging-maven-plugin.version} 124 | true 125 | 126 | oss.sonatype.org 127 | https://oss.sonatype.org/ 128 | ${project.version} 129 | 130 | 131 | 132 | deploy-to-sonatype 133 | deploy 134 | 135 | deploy 136 | release 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | -------------------------------------------------------------------------------- /pubring.gpg.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP MESSAGE----- 2 | Version: GnuPG v1 3 | 4 | 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 66 | R67/OWydp4M/YtYt/E0GDg== 67 | =hRfA 68 | -----END PGP MESSAGE----- 69 | -------------------------------------------------------------------------------- /renovate.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "config:base" 4 | ], 5 | "automerge": true, 6 | "automergeType": "branch", 7 | "major": { 8 | "automerge": false 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /secring.gpg.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP MESSAGE----- 2 | Version: GnuPG v1 3 | 4 | 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 71 | DsP+owMsTkqpuqwF37Y= 72 | =Zg3d 73 | -----END PGP MESSAGE----- 74 | -------------------------------------------------------------------------------- /settings.xml.asc: -------------------------------------------------------------------------------- 1 | -----BEGIN PGP MESSAGE----- 2 | Version: GnuPG v1 3 | 4 | hQEMA5qETcGag5w6AQf9HrlSkxTsQHf89rHnhM7WdpOYSaBCg7qew37D6Q6iMauU 5 | cbFFP7ebv3hVDZmTwDKWwVSCy05v7GMoKOSpsyi/sSrnJoCCFTd+L+0e/Ppi8fIJ 6 | FzqWEcT9VkeNuAiunkXkKDrybue7GllcrTLr6ZO/6x25QHT9kDa6bwpJnBVPOiUT 7 | C6sp0rVz2k4bR1+oN8rRmyVHkLyOdVgsyk8WpQFfzelvYqecmzXM9ZOuC2b1rjIY 8 | hx9wvtYl80no7U7L0Meei+SZuEngosrD/eYHVtE3BDR/vZSuCfPOEvcDcC2cc2xs 9 | PI7z/0I8MwccLDfHZGiKMbdcmDL70ftM8xhA/KqJ1NLpAQJT6u3TxJeHSiMlYYcr 10 | BjY0YylmtQPoojllwNAl68ILMbnMNoEsHwmJx5GgGsnjZRFU/UC6TOIA/BRTCIpS 11 | hgTxUZUq72xVh7q6zO+HJ+lqSVCX0e37dSTMqYTjAQ151elEjOMmfW7p+TSpftOq 12 | RxcD03alS7NJk+d9mYtZMeJaWnpLAUdQ1MbZ4hQCSQoa2/CGgbJl/1VXSt6k9fmt 13 | a0Li1/Mkm7VDa/AHo6SUkPokSlKokprFjC4rttUMWxb4ZPFkVdZs3BwFfYNQNJeI 14 | ZsIIMLPPn7z2qqnVjne0N3JEM+yLzpE/Va/AaIGuOgmyAoLI98MxF+FtiapX54NJ 15 | BugHfuDWOoR/09fotUpZmsfV75ga64wq82+jPgIa636vZs5BFBMz71RdLADK8OK+ 16 | cDmlliRqVc3apZd+Mpk1Itn8RSmvyB9IGhBkvBDfjt8mNGahVj3KN6xg9Z4iTXMO 17 | /tVBSoATOrYRf/oWQsgpnXcnuBTPXGsljV5WFDsJvj5d1ojUUBbI9jsTmP7w1VIQ 18 | 3/Wan4pQHm/3xskED+CvYfUTusQvZPC/wGN+4ejfVwfZ+MsGsRuuqO9ombdfECtP 19 | vTZ06LHc3K/pJKzueHIs3dFO0GiKtiLW6Cfc/ROAY/s2GUJplPgI8vsM+7XoIOgU 20 | /eQIPo6qgJPIpO8VgaQOHCsdpv5hbsD/zt3v1Jud9St4Z2POZMh8HYiGyoX/dHA= 21 | =9KUg 22 | -----END PGP MESSAGE----- 23 | --------------------------------------------------------------------------------