├── src └── main │ └── java │ └── dev │ └── quosty │ ├── packet │ └── NatsPacket.java │ ├── callback │ └── NatsCallback.java │ ├── handler │ └── NatsPacketHandler.java │ ├── listener │ └── NatsListener.java │ ├── serialization │ └── NatsSerialization.java │ └── NatsWrapper.java ├── pom.xml ├── README.md └── .gitignore /src/main/java/dev/quosty/packet/NatsPacket.java: -------------------------------------------------------------------------------- 1 | package dev.quosty.packet; 2 | 3 | public class NatsPacket { } -------------------------------------------------------------------------------- /src/main/java/dev/quosty/callback/NatsCallback.java: -------------------------------------------------------------------------------- 1 | package dev.quosty.callback; 2 | 3 | import dev.quosty.packet.NatsPacket; 4 | 5 | public abstract class NatsCallback { 6 | 7 | public abstract void onReceive(T packet); 8 | public abstract void exit(); 9 | 10 | } -------------------------------------------------------------------------------- /src/main/java/dev/quosty/handler/NatsPacketHandler.java: -------------------------------------------------------------------------------- 1 | package dev.quosty.handler; 2 | 3 | import dev.quosty.callback.NatsCallback; 4 | import dev.quosty.listener.NatsListener; 5 | import dev.quosty.packet.NatsPacket; 6 | 7 | public interface NatsPacketHandler { 8 | 9 | void registerListener(NatsListener listener); 10 | 11 | void sendPacket(String channel, T packet); 12 | void sendCallbackPacket(String channel, NatsPacket packet, int duration, NatsCallback request); 13 | 14 | } -------------------------------------------------------------------------------- /src/main/java/dev/quosty/listener/NatsListener.java: -------------------------------------------------------------------------------- 1 | package dev.quosty.listener; 2 | 3 | import dev.quosty.packet.NatsPacket; 4 | public abstract class NatsListener { 5 | 6 | private final String channel; 7 | private final Class packet; 8 | 9 | public abstract void onReceive(T packet, String replyTo); 10 | 11 | public NatsListener(String channel, Class packet) { 12 | this.channel = channel; 13 | this.packet = packet; 14 | } 15 | 16 | public String getChannel() { 17 | return this.channel; 18 | } 19 | 20 | public Class getPacket() { 21 | return this.packet; 22 | } 23 | } -------------------------------------------------------------------------------- /src/main/java/dev/quosty/serialization/NatsSerialization.java: -------------------------------------------------------------------------------- 1 | package dev.quosty.serialization; 2 | 3 | import java.io.ByteArrayInputStream; 4 | import java.io.ByteArrayOutputStream; 5 | import java.io.IOException; 6 | import java.io.ObjectInputStream; 7 | import java.io.ObjectOutputStream; 8 | 9 | public class NatsSerialization { 10 | 11 | public static byte[] serialize(Object object) throws IOException { 12 | final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); 13 | final ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); 14 | objectOutputStream.writeObject(object); 15 | objectOutputStream.flush(); 16 | return byteArrayOutputStream.toByteArray(); 17 | } 18 | 19 | public static Object deserialize(byte[] bytes) throws IOException, ClassNotFoundException { 20 | final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); 21 | final ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); 22 | return objectInputStream.readObject(); 23 | } 24 | } -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 4.0.0 6 | 7 | dev.quosty 8 | nats-wrapper 9 | 1.1-SNAPSHOT 10 | 11 | 12 | 17 13 | 17 14 | 15 | 16 | 17 | 18 | 19 | org.apache.maven.plugins 20 | maven-shade-plugin 21 | 3.3.0 22 | 23 | 24 | package 25 | 26 | shade 27 | 28 | 29 | 30 | 31 | io.nats 32 | dev.quosty.shade.nats 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | sonatype releases 45 | https://oss.sonatype.org/content/repositories/releases 46 | 47 | true 48 | 49 | 50 | 51 | 52 | 53 | 54 | io.nats 55 | jnats 56 | 2.16.8 57 | 58 | 59 | 60 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Example Java nats-wrapper 2 | 3 | --- 4 | 5 | #### Repository(Maven) 6 | ```xml 7 | 8 | quosty-repository-releases 9 | quosty-dev 10 | https://repo.quosty.dev/releases 11 | 12 | ``` 13 | #### Dependency(Maven) 14 | ```xml 15 | 16 | dev.quosty 17 | nats-wrapper 18 | 1.1-SNAPSHOT 19 | 20 | ``` 21 | 22 | #### Example use: 23 | 24 | ```java 25 | public class ExampleApplication { 26 | 27 | 28 | public static void main(String[] args) { 29 | /* 30 | Create a new instance of the NatsWrapper and connect to the nats-server 31 | */ 32 | NatsWrapper natsWrapper = new NatsWrapper(Nats.connect("nats://localhost:4222")); 33 | 34 | /* 35 | Listening to packets on the channel 36 | */ 37 | natsWrapper.registerListener(new NatsExampleListener()); 38 | 39 | /* 40 | Create ExampleObject 41 | */ 42 | ExampleObject exampleObject = new ExampleObject("test"); 43 | 44 | /* 45 | Sending packet 46 | */ 47 | natsWrapper.sendPacket( 48 | "nats.example.listener", // Channel 49 | exampleObject // Object 50 | ); 51 | 52 | /* 53 | Sending a callback packet 54 | */ 55 | 56 | natsWrapper.sendCallbackPacket( 57 | "nats.example.listener", // Channel 58 | exampleObject, // Object 59 | 3000, // Timeout 60 | new NatsCallback() { 61 | @Override 62 | public void onReceive(ExampleObject packet) { 63 | System.out.println("Received callback packet"); 64 | } 65 | 66 | @Override 67 | public void exit() { 68 | System.out.println("Timeout"); 69 | } 70 | } 71 | ); 72 | } 73 | } 74 | ``` 75 | 76 | #### Example Listener 77 | 78 | ```java 79 | public class NatsExampleListener extends NatsListener { 80 | 81 | public NatsExampleListener() { 82 | super("nats.example.listener", ExampleObject.class); 83 | } 84 | 85 | @Override 86 | public void onReceive(ExampleObject packet, String replyTo) { 87 | System.out.println("Received ExampleObject: " + packet.getUserName()); 88 | } 89 | } 90 | ``` 91 | 92 | #### Example Object 93 | 94 | ```java 95 | public class ExampleObject extends NatsPacket { 96 | 97 | private final String userName; 98 | 99 | public ExampleObject(String userName) { 100 | this.userName = userName; 101 | } 102 | } 103 | ``` 104 | -------------------------------------------------------------------------------- /src/main/java/dev/quosty/NatsWrapper.java: -------------------------------------------------------------------------------- 1 | package dev.quosty; 2 | 3 | import dev.quosty.callback.NatsCallback; 4 | import dev.quosty.handler.NatsPacketHandler; 5 | import dev.quosty.listener.NatsListener; 6 | import dev.quosty.packet.NatsPacket; 7 | import dev.quosty.serialization.NatsSerialization; 8 | import io.nats.client.Connection; 9 | import io.nats.client.Dispatcher; 10 | import io.nats.client.Message; 11 | 12 | import java.io.IOException; 13 | import java.time.Duration; 14 | 15 | public class NatsWrapper implements NatsPacketHandler { 16 | 17 | private final Connection connection; 18 | 19 | public NatsWrapper(Connection connection) { 20 | this.connection = connection; 21 | } 22 | 23 | @Override 24 | @SuppressWarnings("unchecked") 25 | public void registerListener(NatsListener listener) { 26 | Dispatcher dispatcher = this.connection.createDispatcher(message -> { 27 | NatsPacket receivedPacket; 28 | 29 | try { 30 | receivedPacket = (NatsPacket) NatsSerialization.deserialize(message.getData()); 31 | } catch (IOException | ClassNotFoundException exception) { 32 | throw new RuntimeException(exception); 33 | } 34 | 35 | if (!receivedPacket.getClass().isAssignableFrom(listener.getPacket())) { 36 | return; 37 | } 38 | 39 | if (message.getReplyTo() == null){ 40 | listener.onReceive((T) receivedPacket, null); 41 | return; 42 | } 43 | 44 | listener.onReceive((T) receivedPacket, message.getReplyTo()); 45 | }); 46 | 47 | dispatcher.subscribe(listener.getChannel()); 48 | System.out.println("[nats-wrapper] Subscribed channel " + listener.getChannel() + " with packet " + listener.getPacket().getSimpleName()); 49 | } 50 | 51 | @Override 52 | @SuppressWarnings("unchecked") 53 | public void sendCallbackPacket(String channel, NatsPacket packet, int duration, NatsCallback request) { 54 | Message reply; 55 | 56 | try { 57 | reply = this.connection.request(channel, NatsSerialization.serialize(packet), Duration.ofMillis(duration)); 58 | } catch (InterruptedException | IOException exception) { 59 | request.exit(); 60 | return; 61 | } 62 | 63 | if (reply == null) { 64 | request.exit(); 65 | return; 66 | } 67 | 68 | try { 69 | request.onReceive((T) NatsSerialization.deserialize(reply.getData())); 70 | } catch (IOException | ClassNotFoundException exception) { 71 | throw new RuntimeException(exception); 72 | } 73 | } 74 | 75 | @Override 76 | public void sendPacket(String channel, T packet) { 77 | try { 78 | this.connection.publish(channel, NatsSerialization.serialize(packet)); 79 | } catch (IOException exception) { 80 | throw new RuntimeException(exception); 81 | } 82 | } 83 | 84 | public Connection getConnection() { 85 | return this.connection; 86 | } 87 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/java,jetbrains,jetbrains+all,jetbrains+iml,maven,intellij,intellij+all,intellij+iml 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=java,jetbrains,jetbrains+all,jetbrains+iml,maven,intellij,intellij+all,intellij+iml 3 | 4 | ### Intellij ### 5 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 6 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 7 | 8 | # User-specific stuff 9 | .idea/**/workspace.xml 10 | .idea/**/tasks.xml 11 | .idea/**/usage.statistics.xml 12 | .idea/**/dictionaries 13 | .idea/**/shelf 14 | 15 | # AWS User-specific 16 | .idea/**/aws.xml 17 | 18 | # Generated files 19 | .idea/**/contentModel.xml 20 | 21 | # Sensitive or high-churn files 22 | .idea/**/dataSources/ 23 | .idea/**/dataSources.ids 24 | .idea/**/dataSources.local.xml 25 | .idea/**/sqlDataSources.xml 26 | .idea/**/dynamic.xml 27 | .idea/**/uiDesigner.xml 28 | .idea/**/dbnavigator.xml 29 | 30 | # Gradle 31 | .idea/**/gradle.xml 32 | .idea/**/libraries 33 | 34 | # Gradle and Maven with auto-import 35 | # When using Gradle or Maven with auto-import, you should exclude module files, 36 | # since they will be recreated, and may cause churn. Uncomment if using 37 | # auto-import. 38 | # .idea/artifacts 39 | # .idea/compiler.xml 40 | # .idea/jarRepositories.xml 41 | # .idea/modules.xml 42 | # .idea/*.iml 43 | # .idea/modules 44 | # *.iml 45 | # *.ipr 46 | 47 | # CMake 48 | cmake-build-*/ 49 | 50 | # Mongo Explorer plugin 51 | .idea/**/mongoSettings.xml 52 | 53 | # File-based project format 54 | *.iws 55 | 56 | # IntelliJ 57 | out/ 58 | 59 | # mpeltonen/sbt-idea plugin 60 | .idea_modules/ 61 | 62 | # JIRA plugin 63 | atlassian-ide-plugin.xml 64 | 65 | # Cursive Clojure plugin 66 | .idea/replstate.xml 67 | 68 | # SonarLint plugin 69 | .idea/sonarlint/ 70 | 71 | # Crashlytics plugin (for Android Studio and IntelliJ) 72 | com_crashlytics_export_strings.xml 73 | crashlytics.properties 74 | crashlytics-build.properties 75 | fabric.properties 76 | 77 | # Editor-based Rest Client 78 | .idea/httpRequests 79 | 80 | # Android studio 3.1+ serialized cache file 81 | .idea/caches/build_file_checksums.ser 82 | 83 | ### Intellij Patch ### 84 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 85 | 86 | # *.iml 87 | # modules.xml 88 | # .idea/misc.xml 89 | # *.ipr 90 | 91 | # Sonarlint plugin 92 | # https://plugins.jetbrains.com/plugin/7973-sonarlint 93 | .idea/**/sonarlint/ 94 | 95 | # SonarQube Plugin 96 | # https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin 97 | .idea/**/sonarIssues.xml 98 | 99 | # Markdown Navigator plugin 100 | # https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced 101 | .idea/**/markdown-navigator.xml 102 | .idea/**/markdown-navigator-enh.xml 103 | .idea/**/markdown-navigator/ 104 | 105 | # Cache file creation bug 106 | # See https://youtrack.jetbrains.com/issue/JBR-2257 107 | .idea/$CACHE_FILE$ 108 | 109 | # CodeStream plugin 110 | # https://plugins.jetbrains.com/plugin/12206-codestream 111 | .idea/codestream.xml 112 | 113 | # Azure Toolkit for IntelliJ plugin 114 | # https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij 115 | .idea/**/azureSettings.xml 116 | 117 | ### Intellij+all ### 118 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 119 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 120 | 121 | # User-specific stuff 122 | 123 | # AWS User-specific 124 | 125 | # Generated files 126 | 127 | # Sensitive or high-churn files 128 | 129 | # Gradle 130 | 131 | # Gradle and Maven with auto-import 132 | # When using Gradle or Maven with auto-import, you should exclude module files, 133 | # since they will be recreated, and may cause churn. Uncomment if using 134 | # auto-import. 135 | # .idea/artifacts 136 | # .idea/compiler.xml 137 | # .idea/jarRepositories.xml 138 | # .idea/modules.xml 139 | # .idea/*.iml 140 | # .idea/modules 141 | # *.iml 142 | # *.ipr 143 | 144 | # CMake 145 | 146 | # Mongo Explorer plugin 147 | 148 | # File-based project format 149 | 150 | # IntelliJ 151 | 152 | # mpeltonen/sbt-idea plugin 153 | 154 | # JIRA plugin 155 | 156 | # Cursive Clojure plugin 157 | 158 | # SonarLint plugin 159 | 160 | # Crashlytics plugin (for Android Studio and IntelliJ) 161 | 162 | # Editor-based Rest Client 163 | 164 | # Android studio 3.1+ serialized cache file 165 | 166 | ### Intellij+all Patch ### 167 | # Ignore everything but code style settings and run configurations 168 | # that are supposed to be shared within teams. 169 | 170 | .idea/* 171 | 172 | !.idea/codeStyles 173 | !.idea/runConfigurations 174 | 175 | ### Intellij+iml ### 176 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 177 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 178 | 179 | # User-specific stuff 180 | 181 | # AWS User-specific 182 | 183 | # Generated files 184 | 185 | # Sensitive or high-churn files 186 | 187 | # Gradle 188 | 189 | # Gradle and Maven with auto-import 190 | # When using Gradle or Maven with auto-import, you should exclude module files, 191 | # since they will be recreated, and may cause churn. Uncomment if using 192 | # auto-import. 193 | # .idea/artifacts 194 | # .idea/compiler.xml 195 | # .idea/jarRepositories.xml 196 | # .idea/modules.xml 197 | # .idea/*.iml 198 | # .idea/modules 199 | # *.iml 200 | # *.ipr 201 | 202 | # CMake 203 | 204 | # Mongo Explorer plugin 205 | 206 | # File-based project format 207 | 208 | # IntelliJ 209 | 210 | # mpeltonen/sbt-idea plugin 211 | 212 | # JIRA plugin 213 | 214 | # Cursive Clojure plugin 215 | 216 | # SonarLint plugin 217 | 218 | # Crashlytics plugin (for Android Studio and IntelliJ) 219 | 220 | # Editor-based Rest Client 221 | 222 | # Android studio 3.1+ serialized cache file 223 | 224 | ### Intellij+iml Patch ### 225 | # Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 226 | 227 | *.iml 228 | modules.xml 229 | .idea/misc.xml 230 | *.ipr 231 | 232 | ### Java ### 233 | # Compiled class file 234 | *.class 235 | 236 | # Log file 237 | *.log 238 | 239 | # BlueJ files 240 | *.ctxt 241 | 242 | # Mobile Tools for Java (J2ME) 243 | .mtj.tmp/ 244 | 245 | # Package Files # 246 | *.jar 247 | *.war 248 | *.nar 249 | *.ear 250 | *.zip 251 | *.tar.gz 252 | *.rar 253 | 254 | # virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml 255 | hs_err_pid* 256 | replay_pid* 257 | 258 | ### JetBrains ### 259 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 260 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 261 | 262 | # User-specific stuff 263 | 264 | # AWS User-specific 265 | 266 | # Generated files 267 | 268 | # Sensitive or high-churn files 269 | 270 | # Gradle 271 | 272 | # Gradle and Maven with auto-import 273 | # When using Gradle or Maven with auto-import, you should exclude module files, 274 | # since they will be recreated, and may cause churn. Uncomment if using 275 | # auto-import. 276 | # .idea/artifacts 277 | # .idea/compiler.xml 278 | # .idea/jarRepositories.xml 279 | # .idea/modules.xml 280 | # .idea/*.iml 281 | # .idea/modules 282 | # *.iml 283 | # *.ipr 284 | 285 | # CMake 286 | 287 | # Mongo Explorer plugin 288 | 289 | # File-based project format 290 | 291 | # IntelliJ 292 | 293 | # mpeltonen/sbt-idea plugin 294 | 295 | # JIRA plugin 296 | 297 | # Cursive Clojure plugin 298 | 299 | # SonarLint plugin 300 | 301 | # Crashlytics plugin (for Android Studio and IntelliJ) 302 | 303 | # Editor-based Rest Client 304 | 305 | # Android studio 3.1+ serialized cache file 306 | 307 | ### JetBrains Patch ### 308 | # Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721 309 | 310 | # *.iml 311 | # modules.xml 312 | # .idea/misc.xml 313 | # *.ipr 314 | 315 | # Sonarlint plugin 316 | # https://plugins.jetbrains.com/plugin/7973-sonarlint 317 | 318 | # SonarQube Plugin 319 | # https://plugins.jetbrains.com/plugin/7238-sonarqube-community-plugin 320 | 321 | # Markdown Navigator plugin 322 | # https://plugins.jetbrains.com/plugin/7896-markdown-navigator-enhanced 323 | 324 | # Cache file creation bug 325 | # See https://youtrack.jetbrains.com/issue/JBR-2257 326 | 327 | # CodeStream plugin 328 | # https://plugins.jetbrains.com/plugin/12206-codestream 329 | 330 | # Azure Toolkit for IntelliJ plugin 331 | # https://plugins.jetbrains.com/plugin/8053-azure-toolkit-for-intellij 332 | 333 | ### JetBrains+all ### 334 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 335 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 336 | 337 | # User-specific stuff 338 | 339 | # AWS User-specific 340 | 341 | # Generated files 342 | 343 | # Sensitive or high-churn files 344 | 345 | # Gradle 346 | 347 | # Gradle and Maven with auto-import 348 | # When using Gradle or Maven with auto-import, you should exclude module files, 349 | # since they will be recreated, and may cause churn. Uncomment if using 350 | # auto-import. 351 | # .idea/artifacts 352 | # .idea/compiler.xml 353 | # .idea/jarRepositories.xml 354 | # .idea/modules.xml 355 | # .idea/*.iml 356 | # .idea/modules 357 | # *.iml 358 | # *.ipr 359 | 360 | # CMake 361 | 362 | # Mongo Explorer plugin 363 | 364 | # File-based project format 365 | 366 | # IntelliJ 367 | 368 | # mpeltonen/sbt-idea plugin 369 | 370 | # JIRA plugin 371 | 372 | # Cursive Clojure plugin 373 | 374 | # SonarLint plugin 375 | 376 | # Crashlytics plugin (for Android Studio and IntelliJ) 377 | 378 | # Editor-based Rest Client 379 | 380 | # Android studio 3.1+ serialized cache file 381 | 382 | ### JetBrains+all Patch ### 383 | # Ignore everything but code style settings and run configurations 384 | # that are supposed to be shared within teams. 385 | 386 | 387 | 388 | ### JetBrains+iml ### 389 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 390 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 391 | 392 | # User-specific stuff 393 | 394 | # AWS User-specific 395 | 396 | # Generated files 397 | 398 | # Sensitive or high-churn files 399 | 400 | # Gradle 401 | 402 | # Gradle and Maven with auto-import 403 | # When using Gradle or Maven with auto-import, you should exclude module files, 404 | # since they will be recreated, and may cause churn. Uncomment if using 405 | # auto-import. 406 | # .idea/artifacts 407 | # .idea/compiler.xml 408 | # .idea/jarRepositories.xml 409 | # .idea/modules.xml 410 | # .idea/*.iml 411 | # .idea/modules 412 | # *.iml 413 | # *.ipr 414 | 415 | # CMake 416 | 417 | # Mongo Explorer plugin 418 | 419 | # File-based project format 420 | 421 | # IntelliJ 422 | 423 | # mpeltonen/sbt-idea plugin 424 | 425 | # JIRA plugin 426 | 427 | # Cursive Clojure plugin 428 | 429 | # SonarLint plugin 430 | 431 | # Crashlytics plugin (for Android Studio and IntelliJ) 432 | 433 | # Editor-based Rest Client 434 | 435 | # Android studio 3.1+ serialized cache file 436 | 437 | ### JetBrains+iml Patch ### 438 | # Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023 439 | 440 | 441 | ### Maven ### 442 | target/ 443 | pom.xml.tag 444 | pom.xml.releaseBackup 445 | pom.xml.versionsBackup 446 | pom.xml.next 447 | release.properties 448 | dependency-reduced-pom.xml 449 | buildNumber.properties 450 | .mvn/timing.properties 451 | # https://github.com/takari/maven-wrapper#usage-without-binary-jar 452 | .mvn/wrapper/maven-wrapper.jar 453 | 454 | # Eclipse m2e generated files 455 | # Eclipse Core 456 | .project 457 | # JDT-specific (Eclipse Java Development Tools) 458 | .classpath 459 | 460 | # End of https://www.toptal.com/developers/gitignore/api/java,jetbrains,jetbrains+all,jetbrains+iml,maven,intellij,intellij+all,intellij+iml --------------------------------------------------------------------------------