├── kafkaConsumer ├── src │ └── main │ │ ├── resources │ │ ├── application.properties │ │ └── META-INF │ │ │ └── MANIFEST.MF │ │ └── java │ │ └── com │ │ └── demirai │ │ └── kafkaConsumer │ │ └── KafkaConsumerApplication.java ├── HELP.md ├── pom.xml ├── mvnw.cmd └── mvnw ├── SQL_ServerExample.sql ├── README.md └── docker-compose.yml /kafkaConsumer/src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /kafkaConsumer/src/main/resources/META-INF/MANIFEST.MF: -------------------------------------------------------------------------------- 1 | Manifest-Version: 1.0 2 | Main-Class: com.demirai.kafkaConsumer.KafkaConsumerApplication 3 | 4 | -------------------------------------------------------------------------------- /SQL_ServerExample.sql: -------------------------------------------------------------------------------- 1 | CREATE DATABASE DB_Ecommerce; 2 | 3 | USE DB_Ecommerce; 4 | 5 | CREATE TABLE dbo.TBL_Users( 6 | 7 | User_id INT PRIMARY KEY IDENTITY(1,1), 8 | User_name NVARCHAR(20), 9 | User_surname NVARCHAR(20), 10 | User_phone char(11) 11 | 12 | ); 13 | 14 | CREATE TABLE dbo.TBL_Order( 15 | 16 | Order_id INT PRIMARY KEY IDENTITY(1,1), 17 | User_id INT FOREIGN KEY REFERENCES TBL_Users(User_id), 18 | Order_name NVARCHAR(30), 19 | Order_price money 20 | 21 | ); 22 | 23 | GO 24 | EXEC sys.sp_cdc_enable_db 25 | GO 26 | 27 | 28 | GO 29 | EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', 30 | @source_name = N'TBL_Users', 31 | @role_name = NULL, 32 | @supports_net_changes = 0; 33 | GO 34 | 35 | GO 36 | EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', 37 | @source_name = N'TBL_Order', 38 | @role_name = NULL, 39 | @supports_net_changes = 0; 40 | GO 41 | 42 | 43 | INSERT INTO TBL_Users VALUES('Ahmet Furkan','DEMIR','552'); 44 | INSERT INTO TBL_Users VALUES('Mustafa','Kalemci','554'); 45 | 46 | INSERT INTO TBL_Order VALUES(1,'Pizza',200); 47 | INSERT INTO TBL_Order VALUES(1,'Kulaklik',600); 48 | 49 | -------------------------------------------------------------------------------- /kafkaConsumer/HELP.md: -------------------------------------------------------------------------------- 1 | # Getting Started 2 | 3 | ### Reference Documentation 4 | For further reference, please consider the following sections: 5 | 6 | * [Official Apache Maven documentation](https://maven.apache.org/guides/index.html) 7 | * [Spring Boot Maven Plugin Reference Guide](https://docs.spring.io/spring-boot/docs/2.6.7/maven-plugin/reference/html/) 8 | * [Create an OCI image](https://docs.spring.io/spring-boot/docs/2.6.7/maven-plugin/reference/html/#build-image) 9 | * [Spring for Apache Kafka](https://docs.spring.io/spring-boot/docs/2.6.7/reference/htmlsingle/#boot-features-kafka) 10 | * [Cloud Stream](https://docs.spring.io/spring-cloud-stream/docs/current/reference/html/spring-cloud-stream.html#spring-cloud-stream-overview-introducing) 11 | * [Cloud Bus](https://docs.spring.io/spring-cloud-bus/docs/current/reference/html/) 12 | * [Apache Kafka Streams Support](https://docs.spring.io/spring-kafka/docs/current/reference/html/#streams-kafka-streams) 13 | * [Apache Kafka Streams Binding Capabilities of Spring Cloud Stream](https://docs.spring.io/spring-cloud-stream/docs/current/reference/htmlsingle/#_kafka_streams_binding_capabilities_of_spring_cloud_stream) 14 | 15 | ### Guides 16 | The following guides illustrate how to use some features concretely: 17 | 18 | * [Samples for using Apache Kafka Streams with Spring Cloud stream](https://github.com/spring-cloud/spring-cloud-stream-samples/tree/master/kafka-streams-samples) 19 | 20 | -------------------------------------------------------------------------------- /kafkaConsumer/src/main/java/com/demirai/kafkaConsumer/KafkaConsumerApplication.java: -------------------------------------------------------------------------------- 1 | package com.demirai.kafkaConsumer; 2 | 3 | import com.google.gson.Gson; 4 | import com.google.gson.GsonBuilder; 5 | import com.google.gson.JsonElement; 6 | import com.google.gson.JsonParser; 7 | import org.apache.avro.generic.GenericRecord; 8 | import org.apache.kafka.clients.consumer.*; 9 | 10 | import java.util.Arrays; 11 | import java.util.Properties; 12 | 13 | public class KafkaConsumerApplication { 14 | 15 | public static void main(String[] args) { 16 | 17 | System.out.println("Starting...."); 18 | 19 | // settings 20 | Properties props = new Properties(); 21 | props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "0.0.0.0:9092"); 22 | props.put(ConsumerConfig.GROUP_ID_CONFIG, "group1"); 23 | props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer"); 24 | props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "io.confluent.kafka.serializers.KafkaAvroDeserializer"); 25 | props.put("schema.registry.url", "http://0.0.0.0:8081"); 26 | props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); 27 | 28 | String topic0 = "DB_EcommerceServerUsers.dbo.TBL_Users"; 29 | String topic1 = "DB_EcommerceServerOrder.dbo.TBL_Order"; 30 | 31 | final Consumer consumer = new KafkaConsumer(props); 32 | consumer.subscribe(Arrays.asList(topic0, topic1)); 33 | 34 | try { 35 | while (true) { 36 | 37 | ConsumerRecords records = consumer.poll(100); 38 | 39 | for (ConsumerRecord record : records) { 40 | 41 | 42 | try{ 43 | Gson gson = new GsonBuilder().setPrettyPrinting().create(); 44 | JsonParser jp = new JsonParser(); 45 | JsonElement je = jp.parse(record.value().toString()); 46 | String prettyJsonString = gson.toJson(je); 47 | 48 | System.out.println(prettyJsonString); 49 | } catch (Exception e){ 50 | 51 | } 52 | } 53 | } 54 | } finally { 55 | consumer.close(); 56 | } 57 | 58 | } 59 | 60 | } 61 | -------------------------------------------------------------------------------- /kafkaConsumer/pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | org.springframework.boot 7 | spring-boot-starter-parent 8 | 2.6.7 9 | 10 | 11 | com.demirai 12 | kafkaConsumer 13 | 0.0.1-SNAPSHOT 14 | kafkaConsumer 15 | kafka Consumer 16 | 17 | 17 18 | 2021.0.2 19 | 20 | 21 | 22 | org.apache.kafka 23 | kafka-streams 24 | 25 | 26 | org.springframework.cloud 27 | spring-cloud-bus 28 | 29 | 30 | org.apache.avro 31 | avro 32 | 1.11.0 33 | 34 | 35 | org.springframework.cloud 36 | spring-cloud-stream 37 | 38 | 39 | org.springframework.cloud 40 | spring-cloud-stream-binder-kafka 41 | 42 | 43 | org.springframework.cloud 44 | spring-cloud-stream-binder-kafka-streams 45 | 46 | 47 | org.springframework.kafka 48 | spring-kafka 49 | 50 | 51 | 52 | org.springframework.boot 53 | spring-boot-starter-test 54 | test 55 | 56 | 57 | com.google.code.gson 58 | gson 59 | 2.8.5 60 | 61 | 62 | io.confluent 63 | kafka-avro-serializer 64 | 5.3.0 65 | 66 | 67 | org.springframework.cloud 68 | spring-cloud-stream 69 | test 70 | test-binder 71 | test-jar 72 | 73 | 74 | org.springframework.kafka 75 | spring-kafka-test 76 | test 77 | 78 | 79 | 80 | 81 | 82 | org.springframework.cloud 83 | spring-cloud-dependencies 84 | ${spring-cloud.version} 85 | pom 86 | import 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | org.springframework.boot 95 | spring-boot-maven-plugin 96 | 97 | 98 | 99 | 100 | 101 | 102 | confluent 103 | https://packages.confluent.io/maven/ 104 | 105 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![](https://img.shields.io/badge/Java-ED8B00?style=for-the-badge&logo=java&logoColor=white) ![](https://img.shields.io/badge/Spring-6DB33F?style=for-the-badge&logo=spring&logoColor=white) ![](https://img.shields.io/badge/Apache_Kafka-231F20?style=for-the-badge&logo=apache-kafka&logoColor=white) ![](https://img.shields.io/badge/Microsoft%20SQL%20Server-CC2927?style=for-the-badge&logo=microsoft%20sql%20server&logoColor=white) 2 | 3 | 4 | ## SQL Server Kafka Example 5 | 6 | ![index](https://user-images.githubusercontent.com/54184905/169161043-3a33ca1f-d267-40fd-83be-f1cd130e5508.jpeg) 7 | 8 | Hello everyone, in this example, when a change is detected in SQL Server (Insert, Update and Delete), we will capture it with Debezium connect and write it to Kafka and then read it. 9 | 10 | First of all, we need to run the images in the [docker-compose.yml](/docker-compose.yml) file. The images in this file are respectively zookeeper, broker (Confluent Kafka), schema-registry, Debezium Connect, Confluentinc Control-center and Ksql. Use the commands below to run Docker images. 11 | 12 | [Installing Docker](https://docs.docker.com/engine/install/ubuntu/) 13 | 14 | 15 | ```terminal 16 | # Cleaning up Docker images 17 | docker rm -f $(docker ps -a -q) 18 | docker volume rm $(docker volume ls -q) 19 | 20 | # Running all images 21 | docker-compose up 22 | ``` 23 | 24 | Now that we have all our images running smoothly, we can now switch to SQL Server months, if you want to use the tables I use, it will be enough to run the sql queries named [SQL_ServerExample.sql](/SQL_ServerExample.sql). Then run the following SQL query by modifying it according to your own tables. 25 | 26 | ```sql 27 | # Command to turn on Change Data Capture on the selected database. 28 | USE DB_Ecommerce 29 | EXEC sys.sp_cdc_enable_db 30 | 31 | # The command to turn on the Change Data Capture feature in the selected tables, modify this command according to how many tables you have and run it again. 32 | EXEC sys.sp_cdc_enable_table @source_schema = N'dbo', @source_name = N'TBL_Users', @role_name = NULL, @supports_net_changes = 0; 33 | ``` 34 | 35 | Now our settings in SQL server are finished, now we need to connect our tables with the Debezium connector at the address 0.0.0.0:8083, for this we will post it to this address with the following command, we need to establish a special connection for each table separately. 36 | 37 | 38 | ```terminal 39 | # Table0 40 | curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" 0.0.0.0:8083/connectors/ -d '{ "name": "SqlServer_TBL_Users", 41 | "config": { 42 | "connector.class": "io.debezium.connector.sqlserver.SqlServerConnector", 43 | "database.hostname": "192.168.1.8", 44 | "database.port": "1433", 45 | "database.user": "SA", 46 | "database.password": "123456789Zz.", 47 | "database.dbname": "DB_Ecommerce", 48 | "database.server.name": "DB_EcommerceServerUsers", 49 | "table.include.list": "dbo.TBL_Users", 50 | "database.history.kafka.bootstrap.servers": "broker:29092", 51 | "database.history.kafka.topic": "dbhistory.DB_EcommerceServerUsers" } 52 | }'; 53 | 54 | # Table1 55 | curl -i -X POST -H "Accept:application/json" -H "Content-Type:application/json" 0.0.0.0:8083/connectors/ -d '{ "name": "SqlServer_TBL_Order", 56 | "config": { 57 | "connector.class": "io.debezium.connector.sqlserver.SqlServerConnector", 58 | "database.hostname": "192.168.1.8", 59 | "database.port": "1433", 60 | "database.user": "SA", 61 | "database.password": "123456789Zz.", 62 | "database.dbname": "DB_Ecommerce", 63 | "database.server.name": "DB_EcommerceServerOrder", 64 | "table.include.list": "dbo.TBL_Order", 65 | "database.history.kafka.bootstrap.servers": "broker:29092", 66 | "database.history.kafka.topic": "dbhistory.DB_EcommerceServerOrder" } 67 | }'; 68 | ``` 69 | 70 | When you go to [http://0.0.0.0:9021/](http://0.0.0.0:9021/) (Confluent Control Center) and click on the connect part, there should be as many Running as the number of tables. If you are not seeing a similar image, you may have made a mistake somewhere, please review the processes up to this point. 71 | 72 | ![Screenshot_2022-05-18_23-49-25](https://user-images.githubusercontent.com/54184905/169154008-9faeee42-b52f-42b6-bcd6-b03a36fdd7c8.png) 73 | Since we haven't had any problems so far, we can add some data to our tables. 74 | 75 | ```sql 76 | INSERT INTO TBL_Users VALUES('Ahmet Furkan','DEMIR','552'); 77 | INSERT INTO TBL_Users VALUES('Mustafa','Kalemci','554'); 78 | 79 | INSERT INTO TBL_Order VALUES(1,'Pizza',200); 80 | INSERT INTO TBL_Order VALUES(1,'Kulaklik',600); 81 | ``` 82 | 83 | After adding data to the tables, go to Confluent Control Center again and examine the Topics section, something like the image below should meet you. It writes to these Topics as Debezium producer and we should read this data as Consumer with Java. 84 | 85 | ![Screenshot_2022-05-18_23-57-37](https://user-images.githubusercontent.com/54184905/169155066-3259f240-c19a-4a2f-9cb6-41ecb20278fa.png) 86 | You can see the changes you have made in the tables through these topics, as in the example picture below. 87 | 88 | ![Screenshot_2022-05-19_00-03-41](https://user-images.githubusercontent.com/54184905/169155688-658fd4df-21d3-4915-ae95-072a79fd0cd3.png) 89 | But reading these messages from the Confluent Control Center will not help us, instead we can read the messages with Java and print the changed data to the new database or transfer it to another place with the API. 90 | 91 | For this, we will use the application written in Java named [kafkaConsumer](/kafkaConsumer/) available in this repository. According to the comment lines in the code, modify your own project and run this application. From this moment, the selected topics in Kafka are listened and when any changes are detected, they are highlighted on the screen. 92 | 93 | ![Screenshot_2022-05-19_00-10-47](https://user-images.githubusercontent.com/54184905/169156803-60021196-8b93-4cbd-8af3-e532c4e3f114.png) 94 | 95 | ![169156797-90ce0139-2693-40db-be32-b543f9210530](https://user-images.githubusercontent.com/54184905/169234102-699f7df9-c1ee-4a61-878f-8063143e69ce.png) 96 | 97 | That's all I'm going to tell you, you can modify this architecture and use it for different purposes in your own projects, take care :). 98 | 99 | [Ahmet Furkan DEMIR](https://www.ahmetfurkandemir.com/) 100 | 101 | 102 | 103 | 104 | -------------------------------------------------------------------------------- /kafkaConsumer/mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM https://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM set title of command window 39 | title %0 40 | @REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' 41 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 42 | 43 | @REM set %HOME% to equivalent of $HOME 44 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 45 | 46 | @REM Execute a user defined script before this one 47 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 48 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 49 | if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* 50 | if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* 51 | :skipRcPre 52 | 53 | @setlocal 54 | 55 | set ERROR_CODE=0 56 | 57 | @REM To isolate internal variables from possible post scripts, we use another setlocal 58 | @setlocal 59 | 60 | @REM ==== START VALIDATION ==== 61 | if not "%JAVA_HOME%" == "" goto OkJHome 62 | 63 | echo. 64 | echo Error: JAVA_HOME not found in your environment. >&2 65 | echo Please set the JAVA_HOME variable in your environment to match the >&2 66 | echo location of your Java installation. >&2 67 | echo. 68 | goto error 69 | 70 | :OkJHome 71 | if exist "%JAVA_HOME%\bin\java.exe" goto init 72 | 73 | echo. 74 | echo Error: JAVA_HOME is set to an invalid directory. >&2 75 | echo JAVA_HOME = "%JAVA_HOME%" >&2 76 | echo Please set the JAVA_HOME variable in your environment to match the >&2 77 | echo location of your Java installation. >&2 78 | echo. 79 | goto error 80 | 81 | @REM ==== END VALIDATION ==== 82 | 83 | :init 84 | 85 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 86 | @REM Fallback to current working directory if not found. 87 | 88 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 89 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 90 | 91 | set EXEC_DIR=%CD% 92 | set WDIR=%EXEC_DIR% 93 | :findBaseDir 94 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 95 | cd .. 96 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 97 | set WDIR=%CD% 98 | goto findBaseDir 99 | 100 | :baseDirFound 101 | set MAVEN_PROJECTBASEDIR=%WDIR% 102 | cd "%EXEC_DIR%" 103 | goto endDetectBaseDir 104 | 105 | :baseDirNotFound 106 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 107 | cd "%EXEC_DIR%" 108 | 109 | :endDetectBaseDir 110 | 111 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 112 | 113 | @setlocal EnableExtensions EnableDelayedExpansion 114 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 115 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 116 | 117 | :endReadAdditionalConfig 118 | 119 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 120 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 121 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 122 | 123 | set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" 124 | 125 | FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( 126 | IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B 127 | ) 128 | 129 | @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 130 | @REM This allows using the maven wrapper in projects that prohibit checking in binary data. 131 | if exist %WRAPPER_JAR% ( 132 | if "%MVNW_VERBOSE%" == "true" ( 133 | echo Found %WRAPPER_JAR% 134 | ) 135 | ) else ( 136 | if not "%MVNW_REPOURL%" == "" ( 137 | SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" 138 | ) 139 | if "%MVNW_VERBOSE%" == "true" ( 140 | echo Couldn't find %WRAPPER_JAR%, downloading it ... 141 | echo Downloading from: %DOWNLOAD_URL% 142 | ) 143 | 144 | powershell -Command "&{"^ 145 | "$webclient = new-object System.Net.WebClient;"^ 146 | "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ 147 | "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ 148 | "}"^ 149 | "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ 150 | "}" 151 | if "%MVNW_VERBOSE%" == "true" ( 152 | echo Finished downloading %WRAPPER_JAR% 153 | ) 154 | ) 155 | @REM End of extension 156 | 157 | @REM Provide a "standardized" way to retrieve the CLI args that will 158 | @REM work with both Windows and non-Windows executions. 159 | set MAVEN_CMD_LINE_ARGS=%* 160 | 161 | %MAVEN_JAVA_EXE% ^ 162 | %JVM_CONFIG_MAVEN_PROPS% ^ 163 | %MAVEN_OPTS% ^ 164 | %MAVEN_DEBUG_OPTS% ^ 165 | -classpath %WRAPPER_JAR% ^ 166 | "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ 167 | %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 168 | if ERRORLEVEL 1 goto error 169 | goto end 170 | 171 | :error 172 | set ERROR_CODE=1 173 | 174 | :end 175 | @endlocal & set ERROR_CODE=%ERROR_CODE% 176 | 177 | if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost 178 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 179 | if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" 180 | if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" 181 | :skipRcPost 182 | 183 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 184 | if "%MAVEN_BATCH_PAUSE%"=="on" pause 185 | 186 | if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% 187 | 188 | cmd /C exit /B %ERROR_CODE% 189 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | --- 2 | version: '2' 3 | services: 4 | zookeeper: 5 | image: confluentinc/cp-zookeeper:7.1.0 6 | hostname: zookeeper 7 | container_name: zookeeper 8 | ports: 9 | - "2181:2181" 10 | environment: 11 | ZOOKEEPER_CLIENT_PORT: 2181 12 | ZOOKEEPER_TICK_TIME: 2000 13 | 14 | broker: 15 | image: confluentinc/cp-server:7.1.0 16 | hostname: broker 17 | container_name: broker 18 | depends_on: 19 | - zookeeper 20 | ports: 21 | - "9092:9092" 22 | - "9101:9101" 23 | environment: 24 | KAFKA_BROKER_ID: 1 25 | KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' 26 | KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT 27 | KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://broker:29092,PLAINTEXT_HOST://localhost:9092 28 | KAFKA_METRIC_REPORTERS: io.confluent.metrics.reporter.ConfluentMetricsReporter 29 | KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1 30 | KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0 31 | KAFKA_CONFLUENT_LICENSE_TOPIC_REPLICATION_FACTOR: 1 32 | KAFKA_CONFLUENT_BALANCER_TOPIC_REPLICATION_FACTOR: 1 33 | KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1 34 | KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1 35 | KAFKA_JMX_PORT: 9101 36 | KAFKA_JMX_HOSTNAME: localhost 37 | KAFKA_CONFLUENT_SCHEMA_REGISTRY_URL: http://schema-registry:8081 38 | CONFLUENT_METRICS_REPORTER_BOOTSTRAP_SERVERS: broker:29092 39 | CONFLUENT_METRICS_REPORTER_TOPIC_REPLICAS: 1 40 | CONFLUENT_METRICS_ENABLE: 'true' 41 | CONFLUENT_SUPPORT_CUSTOMER_ID: 'anonymous' 42 | 43 | schema-registry: 44 | image: confluentinc/cp-schema-registry:7.1.0 45 | hostname: schema-registry 46 | container_name: schema-registry 47 | depends_on: 48 | - broker 49 | ports: 50 | - "8081:8081" 51 | environment: 52 | SCHEMA_REGISTRY_HOST_NAME: schema-registry 53 | SCHEMA_REGISTRY_KAFKASTORE_BOOTSTRAP_SERVERS: 'broker:29092' 54 | SCHEMA_REGISTRY_LISTENERS: http://0.0.0.0:8081 55 | 56 | connect: 57 | image: cnfldemos/cp-server-connect-datagen:0.5.3-7.1.0 58 | hostname: connect 59 | container_name: connect 60 | depends_on: 61 | - broker 62 | - schema-registry 63 | ports: 64 | - "8083:8083" 65 | environment: 66 | CONNECT_BOOTSTRAP_SERVERS: 'broker:29092' 67 | CONNECT_REST_ADVERTISED_HOST_NAME: connect 68 | CONNECT_GROUP_ID: compose-connect-group 69 | CONNECT_CONFIG_STORAGE_TOPIC: docker-connect-configs 70 | CONNECT_CONFIG_STORAGE_REPLICATION_FACTOR: 1 71 | CONNECT_OFFSET_FLUSH_INTERVAL_MS: 10000 72 | CONNECT_OFFSET_STORAGE_TOPIC: docker-connect-offsets 73 | CONNECT_OFFSET_STORAGE_REPLICATION_FACTOR: 1 74 | CONNECT_STATUS_STORAGE_TOPIC: docker-connect-status 75 | CONNECT_STATUS_STORAGE_REPLICATION_FACTOR: 1 76 | CONNECT_KEY_CONVERTER: org.apache.kafka.connect.storage.StringConverter 77 | CONNECT_VALUE_CONVERTER: io.confluent.connect.avro.AvroConverter 78 | CONNECT_VALUE_CONVERTER_SCHEMA_REGISTRY_URL: http://schema-registry:8081 79 | # CLASSPATH required due to CC-2422 80 | CLASSPATH: /usr/share/java/monitoring-interceptors/monitoring-interceptors-7.1.0.jar 81 | CONNECT_PRODUCER_INTERCEPTOR_CLASSES: "io.confluent.monitoring.clients.interceptor.MonitoringProducerInterceptor" 82 | CONNECT_CONSUMER_INTERCEPTOR_CLASSES: "io.confluent.monitoring.clients.interceptor.MonitoringConsumerInterceptor" 83 | CONNECT_PLUGIN_PATH: "/usr/share/java,/usr/share/confluent-hub-components" 84 | CONNECT_LOG4J_LOGGERS: org.apache.zookeeper=ERROR,org.I0Itec.zkclient=ERROR,org.reflections=ERROR 85 | 86 | command: 87 | - bash 88 | - -c 89 | - | 90 | echo "Installing connector plugins" 91 | confluent-hub install --no-prompt debezium/debezium-connector-sqlserver:latest 92 | # 93 | echo "Launching Kafka Connect worker" 94 | /etc/confluent/docker/run & 95 | # 96 | sleep infinity 97 | 98 | control-center: 99 | image: confluentinc/cp-enterprise-control-center:7.1.0 100 | hostname: control-center 101 | container_name: control-center 102 | depends_on: 103 | - broker 104 | - schema-registry 105 | - connect 106 | - ksqldb-server 107 | ports: 108 | - "9021:9021" 109 | environment: 110 | CONTROL_CENTER_BOOTSTRAP_SERVERS: 'broker:29092' 111 | CONTROL_CENTER_CONNECT_CONNECT-DEFAULT_CLUSTER: 'connect:8083' 112 | CONTROL_CENTER_KSQL_KSQLDB1_URL: "http://ksqldb-server:8088" 113 | CONTROL_CENTER_KSQL_KSQLDB1_ADVERTISED_URL: "http://localhost:8088" 114 | CONTROL_CENTER_SCHEMA_REGISTRY_URL: "http://schema-registry:8081" 115 | CONTROL_CENTER_REPLICATION_FACTOR: 1 116 | CONTROL_CENTER_INTERNAL_TOPICS_PARTITIONS: 1 117 | CONTROL_CENTER_MONITORING_INTERCEPTOR_TOPIC_PARTITIONS: 1 118 | CONFLUENT_METRICS_TOPIC_REPLICATION: 1 119 | PORT: 9021 120 | 121 | ksqldb-server: 122 | image: confluentinc/cp-ksqldb-server:7.1.0 123 | hostname: ksqldb-server 124 | container_name: ksqldb-server 125 | depends_on: 126 | - broker 127 | - connect 128 | ports: 129 | - "8088:8088" 130 | environment: 131 | KSQL_CONFIG_DIR: "/etc/ksql" 132 | KSQL_BOOTSTRAP_SERVERS: "broker:29092" 133 | KSQL_HOST_NAME: ksqldb-server 134 | KSQL_LISTENERS: "http://0.0.0.0:8088" 135 | KSQL_CACHE_MAX_BYTES_BUFFERING: 0 136 | KSQL_KSQL_SCHEMA_REGISTRY_URL: "http://schema-registry:8081" 137 | KSQL_PRODUCER_INTERCEPTOR_CLASSES: "io.confluent.monitoring.clients.interceptor.MonitoringProducerInterceptor" 138 | KSQL_CONSUMER_INTERCEPTOR_CLASSES: "io.confluent.monitoring.clients.interceptor.MonitoringConsumerInterceptor" 139 | KSQL_KSQL_CONNECT_URL: "http://connect:8083" 140 | KSQL_KSQL_LOGGING_PROCESSING_TOPIC_REPLICATION_FACTOR: 1 141 | KSQL_KSQL_LOGGING_PROCESSING_TOPIC_AUTO_CREATE: 'true' 142 | KSQL_KSQL_LOGGING_PROCESSING_STREAM_AUTO_CREATE: 'true' 143 | 144 | ksqldb-cli: 145 | image: confluentinc/cp-ksqldb-cli:7.1.0 146 | container_name: ksqldb-cli 147 | depends_on: 148 | - broker 149 | - connect 150 | - ksqldb-server 151 | entrypoint: /bin/sh 152 | tty: true 153 | 154 | ksql-datagen: 155 | image: confluentinc/ksqldb-examples:7.1.0 156 | hostname: ksql-datagen 157 | container_name: ksql-datagen 158 | depends_on: 159 | - ksqldb-server 160 | - broker 161 | - schema-registry 162 | - connect 163 | command: "bash -c 'echo Waiting for Kafka to be ready... && \ 164 | cub kafka-ready -b broker:29092 1 40 && \ 165 | echo Waiting for Confluent Schema Registry to be ready... && \ 166 | cub sr-ready schema-registry 8081 40 && \ 167 | echo Waiting a few seconds for topic creation to finish... && \ 168 | sleep 11 && \ 169 | tail -f /dev/null'" 170 | environment: 171 | KSQL_CONFIG_DIR: "/etc/ksql" 172 | STREAMS_BOOTSTRAP_SERVERS: broker:29092 173 | STREAMS_SCHEMA_REGISTRY_HOST: schema-registry 174 | STREAMS_SCHEMA_REGISTRY_PORT: 8081 175 | 176 | rest-proxy: 177 | image: confluentinc/cp-kafka-rest:7.1.0 178 | depends_on: 179 | - broker 180 | - schema-registry 181 | ports: 182 | - 8082:8082 183 | hostname: rest-proxy 184 | container_name: rest-proxy 185 | environment: 186 | KAFKA_REST_HOST_NAME: rest-proxy 187 | KAFKA_REST_BOOTSTRAP_SERVERS: 'broker:29092' 188 | KAFKA_REST_LISTENERS: "http://0.0.0.0:8082" 189 | KAFKA_REST_SCHEMA_REGISTRY_URL: 'http://schema-registry:8081' 190 | -------------------------------------------------------------------------------- /kafkaConsumer/mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # https://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Maven Start Up Batch script 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # M2_HOME - location of maven2's installed home dir 31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 32 | # e.g. to debug Maven itself, use 33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 35 | # ---------------------------------------------------------------------------- 36 | 37 | if [ -z "$MAVEN_SKIP_RC" ] ; then 38 | 39 | if [ -f /usr/local/etc/mavenrc ] ; then 40 | . /usr/local/etc/mavenrc 41 | fi 42 | 43 | if [ -f /etc/mavenrc ] ; then 44 | . /etc/mavenrc 45 | fi 46 | 47 | if [ -f "$HOME/.mavenrc" ] ; then 48 | . "$HOME/.mavenrc" 49 | fi 50 | 51 | fi 52 | 53 | # OS specific support. $var _must_ be set to either true or false. 54 | cygwin=false; 55 | darwin=false; 56 | mingw=false 57 | case "`uname`" in 58 | CYGWIN*) cygwin=true ;; 59 | MINGW*) mingw=true;; 60 | Darwin*) darwin=true 61 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 62 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 63 | if [ -z "$JAVA_HOME" ]; then 64 | if [ -x "/usr/libexec/java_home" ]; then 65 | export JAVA_HOME="`/usr/libexec/java_home`" 66 | else 67 | export JAVA_HOME="/Library/Java/Home" 68 | fi 69 | fi 70 | ;; 71 | esac 72 | 73 | if [ -z "$JAVA_HOME" ] ; then 74 | if [ -r /etc/gentoo-release ] ; then 75 | JAVA_HOME=`java-config --jre-home` 76 | fi 77 | fi 78 | 79 | if [ -z "$M2_HOME" ] ; then 80 | ## resolve links - $0 may be a link to maven's home 81 | PRG="$0" 82 | 83 | # need this for relative symlinks 84 | while [ -h "$PRG" ] ; do 85 | ls=`ls -ld "$PRG"` 86 | link=`expr "$ls" : '.*-> \(.*\)$'` 87 | if expr "$link" : '/.*' > /dev/null; then 88 | PRG="$link" 89 | else 90 | PRG="`dirname "$PRG"`/$link" 91 | fi 92 | done 93 | 94 | saveddir=`pwd` 95 | 96 | M2_HOME=`dirname "$PRG"`/.. 97 | 98 | # make it fully qualified 99 | M2_HOME=`cd "$M2_HOME" && pwd` 100 | 101 | cd "$saveddir" 102 | # echo Using m2 at $M2_HOME 103 | fi 104 | 105 | # For Cygwin, ensure paths are in UNIX format before anything is touched 106 | if $cygwin ; then 107 | [ -n "$M2_HOME" ] && 108 | M2_HOME=`cygpath --unix "$M2_HOME"` 109 | [ -n "$JAVA_HOME" ] && 110 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 111 | [ -n "$CLASSPATH" ] && 112 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"` 113 | fi 114 | 115 | # For Mingw, ensure paths are in UNIX format before anything is touched 116 | if $mingw ; then 117 | [ -n "$M2_HOME" ] && 118 | M2_HOME="`(cd "$M2_HOME"; pwd)`" 119 | [ -n "$JAVA_HOME" ] && 120 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" 121 | fi 122 | 123 | if [ -z "$JAVA_HOME" ]; then 124 | javaExecutable="`which javac`" 125 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then 126 | # readlink(1) is not available as standard on Solaris 10. 127 | readLink=`which readlink` 128 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then 129 | if $darwin ; then 130 | javaHome="`dirname \"$javaExecutable\"`" 131 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" 132 | else 133 | javaExecutable="`readlink -f \"$javaExecutable\"`" 134 | fi 135 | javaHome="`dirname \"$javaExecutable\"`" 136 | javaHome=`expr "$javaHome" : '\(.*\)/bin'` 137 | JAVA_HOME="$javaHome" 138 | export JAVA_HOME 139 | fi 140 | fi 141 | fi 142 | 143 | if [ -z "$JAVACMD" ] ; then 144 | if [ -n "$JAVA_HOME" ] ; then 145 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 146 | # IBM's JDK on AIX uses strange locations for the executables 147 | JAVACMD="$JAVA_HOME/jre/sh/java" 148 | else 149 | JAVACMD="$JAVA_HOME/bin/java" 150 | fi 151 | else 152 | JAVACMD="`\\unset -f command; \\command -v java`" 153 | fi 154 | fi 155 | 156 | if [ ! -x "$JAVACMD" ] ; then 157 | echo "Error: JAVA_HOME is not defined correctly." >&2 158 | echo " We cannot execute $JAVACMD" >&2 159 | exit 1 160 | fi 161 | 162 | if [ -z "$JAVA_HOME" ] ; then 163 | echo "Warning: JAVA_HOME environment variable is not set." 164 | fi 165 | 166 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher 167 | 168 | # traverses directory structure from process work directory to filesystem root 169 | # first directory with .mvn subdirectory is considered project base directory 170 | find_maven_basedir() { 171 | 172 | if [ -z "$1" ] 173 | then 174 | echo "Path not specified to find_maven_basedir" 175 | return 1 176 | fi 177 | 178 | basedir="$1" 179 | wdir="$1" 180 | while [ "$wdir" != '/' ] ; do 181 | if [ -d "$wdir"/.mvn ] ; then 182 | basedir=$wdir 183 | break 184 | fi 185 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 186 | if [ -d "${wdir}" ]; then 187 | wdir=`cd "$wdir/.."; pwd` 188 | fi 189 | # end of workaround 190 | done 191 | echo "${basedir}" 192 | } 193 | 194 | # concatenates all lines of a file 195 | concat_lines() { 196 | if [ -f "$1" ]; then 197 | echo "$(tr -s '\n' ' ' < "$1")" 198 | fi 199 | } 200 | 201 | BASE_DIR=`find_maven_basedir "$(pwd)"` 202 | if [ -z "$BASE_DIR" ]; then 203 | exit 1; 204 | fi 205 | 206 | ########################################################################################## 207 | # Extension to allow automatically downloading the maven-wrapper.jar from Maven-central 208 | # This allows using the maven wrapper in projects that prohibit checking in binary data. 209 | ########################################################################################## 210 | if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then 211 | if [ "$MVNW_VERBOSE" = true ]; then 212 | echo "Found .mvn/wrapper/maven-wrapper.jar" 213 | fi 214 | else 215 | if [ "$MVNW_VERBOSE" = true ]; then 216 | echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." 217 | fi 218 | if [ -n "$MVNW_REPOURL" ]; then 219 | jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" 220 | else 221 | jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar" 222 | fi 223 | while IFS="=" read key value; do 224 | case "$key" in (wrapperUrl) jarUrl="$value"; break ;; 225 | esac 226 | done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" 227 | if [ "$MVNW_VERBOSE" = true ]; then 228 | echo "Downloading from: $jarUrl" 229 | fi 230 | wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" 231 | if $cygwin; then 232 | wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` 233 | fi 234 | 235 | if command -v wget > /dev/null; then 236 | if [ "$MVNW_VERBOSE" = true ]; then 237 | echo "Found wget ... using wget" 238 | fi 239 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 240 | wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" 241 | else 242 | wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath" 243 | fi 244 | elif command -v curl > /dev/null; then 245 | if [ "$MVNW_VERBOSE" = true ]; then 246 | echo "Found curl ... using curl" 247 | fi 248 | if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then 249 | curl -o "$wrapperJarPath" "$jarUrl" -f 250 | else 251 | curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f 252 | fi 253 | 254 | else 255 | if [ "$MVNW_VERBOSE" = true ]; then 256 | echo "Falling back to using Java to download" 257 | fi 258 | javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" 259 | # For Cygwin, switch paths to Windows format before running javac 260 | if $cygwin; then 261 | javaClass=`cygpath --path --windows "$javaClass"` 262 | fi 263 | if [ -e "$javaClass" ]; then 264 | if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 265 | if [ "$MVNW_VERBOSE" = true ]; then 266 | echo " - Compiling MavenWrapperDownloader.java ..." 267 | fi 268 | # Compiling the Java class 269 | ("$JAVA_HOME/bin/javac" "$javaClass") 270 | fi 271 | if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then 272 | # Running the downloader 273 | if [ "$MVNW_VERBOSE" = true ]; then 274 | echo " - Running MavenWrapperDownloader.java ..." 275 | fi 276 | ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") 277 | fi 278 | fi 279 | fi 280 | fi 281 | ########################################################################################## 282 | # End of extension 283 | ########################################################################################## 284 | 285 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} 286 | if [ "$MVNW_VERBOSE" = true ]; then 287 | echo $MAVEN_PROJECTBASEDIR 288 | fi 289 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 290 | 291 | # For Cygwin, switch paths to Windows format before running java 292 | if $cygwin; then 293 | [ -n "$M2_HOME" ] && 294 | M2_HOME=`cygpath --path --windows "$M2_HOME"` 295 | [ -n "$JAVA_HOME" ] && 296 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` 297 | [ -n "$CLASSPATH" ] && 298 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"` 299 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 300 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` 301 | fi 302 | 303 | # Provide a "standardized" way to retrieve the CLI args that will 304 | # work with both Windows and non-Windows executions. 305 | MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" 306 | export MAVEN_CMD_LINE_ARGS 307 | 308 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 309 | 310 | exec "$JAVACMD" \ 311 | $MAVEN_OPTS \ 312 | $MAVEN_DEBUG_OPTS \ 313 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 314 | "-Dmaven.home=${M2_HOME}" \ 315 | "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 316 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 317 | --------------------------------------------------------------------------------