From b921a3611eba6663ed357dd20a06101fde843213 Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Wed, 17 May 2017 13:09:51 +0300 Subject: [PATCH] =?UTF-8?q?Bridge:=20=D0=BF=D0=B5=D1=80=D0=B2=D0=B0=D1=8F?= =?UTF-8?q?=20=D0=B8=D1=82=D0=B5=D1=80=D0=B0=D1=86=D0=B8=D1=8F=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA=D0=B8=20Sponge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bridge/build.gradle | 4 +- .../asys/bridge/bukkit/BridgeBukkitImpl.java | 37 +++++++++ .../java/asys/bridge/bukkit/BridgePlugin.java | 83 ++----------------- .../asys/bridge/bukkit/ConfigBukkitImpl.java | 26 ++++++ .../asys/bridge/bukkit/LoggerBukkitImpl.java | 32 +++++++ .../asys/bridge/client/AbstractBridge.java | 80 ++++++++++++++++++ .../main/java/asys/bridge/client/Client.java | 7 +- .../bridge/client/ClientPacketHandler.java | 30 +++---- .../main/java/asys/bridge/client/IBridge.java | 18 ++++ .../main/java/asys/bridge/client/IConfig.java | 10 +++ .../main/java/asys/bridge/client/ILogger.java | 11 +++ .../java/asys/bridge/sponge/BridgeSponge.java | 61 +++++++++++++- .../asys/bridge/sponge/BridgeSpongeImpl.java | 35 ++++++++ .../asys/bridge/sponge/ConfigSpongeImpl.java | 26 ++++++ .../asys/bridge/sponge/LoggerSpongeImpl.java | 31 +++++++ build.gradle | 10 +-- 16 files changed, 399 insertions(+), 102 deletions(-) create mode 100644 bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java create mode 100644 bridge/src/main/java/asys/bridge/bukkit/ConfigBukkitImpl.java create mode 100644 bridge/src/main/java/asys/bridge/bukkit/LoggerBukkitImpl.java create mode 100644 bridge/src/main/java/asys/bridge/client/AbstractBridge.java create mode 100644 bridge/src/main/java/asys/bridge/client/IBridge.java create mode 100644 bridge/src/main/java/asys/bridge/client/IConfig.java create mode 100644 bridge/src/main/java/asys/bridge/client/ILogger.java create mode 100644 bridge/src/main/java/asys/bridge/sponge/BridgeSpongeImpl.java create mode 100644 bridge/src/main/java/asys/bridge/sponge/ConfigSpongeImpl.java create mode 100644 bridge/src/main/java/asys/bridge/sponge/LoggerSpongeImpl.java diff --git a/bridge/build.gradle b/bridge/build.gradle index b069061..a139e78 100644 --- a/bridge/build.gradle +++ b/bridge/build.gradle @@ -45,13 +45,13 @@ dependencies { exclude group: 'com.google.code' exclude group: 'com.google.code.findbugs' exclude group: 'com.google.code.gson' - exclude group: 'com.google.inject' exclude group: 'com.github.ben-manes.caffeine' exclude group: 'com.flowpowered' exclude group: 'org.slf4j' exclude group: 'org.apache.commons' exclude group: 'org.ow2.asm' - exclude group: 'ninja.leaping.configurate' + exclude group: 'ninja.leaping.configurate', module: 'configurate-gson' + exclude group: 'ninja.leaping.configurate', module: 'configurate-hocon' } compile group: 'io.netty', name: 'netty-codec', version: nettyVersion } diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java b/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java new file mode 100644 index 0000000..ef26325 --- /dev/null +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgeBukkitImpl.java @@ -0,0 +1,37 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.bukkit; + +import asys.bridge.client.AbstractBridge; +import asys.bridge.client.IBridge; +import asys.bridge.client.IConfig; +import asys.bridge.client.ILogger; + +public class BridgeBukkitImpl extends AbstractBridge implements IBridge { + private BridgePlugin plugin; + private LoggerBukkitImpl logger; + private ConfigBukkitImpl configBukkit; + + public BridgeBukkitImpl(BridgePlugin plugin) { + this.plugin = plugin; + this.logger = new LoggerBukkitImpl(plugin.getLogger()); + this.configBukkit = new ConfigBukkitImpl(plugin.getConfig()); + } + + @Override + public ILogger getLogger() { + return logger; + } + + @Override + public IConfig getConfig() { + return configBukkit; + } + + @Override + public int getCountOnlinePlayers() { + return plugin.getServer().getOnlinePlayers().size(); + } +} diff --git a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java index 2f688ba..5154503 100644 --- a/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java +++ b/bridge/src/main/java/asys/bridge/bukkit/BridgePlugin.java @@ -4,47 +4,25 @@ */ package asys.bridge.bukkit; -import asys.bridge.client.Client; -import asys.mcsmanager.packets.CS_Ping; -import io.netty.channel.Channel; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.plugin.java.JavaPlugin; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.ScheduledFuture; -import java.util.concurrent.TimeUnit; - public class BridgePlugin extends JavaPlugin { - public static BridgePlugin INSTANCE; - private Client client; - private ScheduledExecutorService ses; - private ScheduledFuture sesFuture, sesPingFuture; - private int tryConnect = 0; + private BridgeBukkitImpl bridgeBukkit; @Override public void onEnable() { - INSTANCE = this; saveDefaultConfig(); - - startReconnect(); + this.bridgeBukkit = new BridgeBukkitImpl(this); + this.bridgeBukkit.startReconnect(); } @Override public void onDisable() { - if (sesFuture != null) { - sesFuture.cancel(false); - } - - stopPing(); - - if (client.isConnected()) { - getLogger().info("Disconnect..."); - client.disconnect(); - } - - INSTANCE = null; + this.bridgeBukkit.stopReconnect(); + this.bridgeBukkit.stopPing(); + this.bridgeBukkit.disconnect(); } @Override @@ -52,53 +30,4 @@ public class BridgePlugin extends JavaPlugin { sender.sendMessage("ASys Bridge by DmitriyMX"); return true; } - - public void startReconnect() { - client = new Client(); - ses = Executors.newScheduledThreadPool(2); - sesFuture = ses.scheduleAtFixedRate(() -> { - getLogger().info(String.format("Connect(%d) to ASys...", ++tryConnect)); - client.connect(getConfig().getString("host"), getConfig().getInt("port")); - if (client.isConnected()) { - stopReconnect(); - } else { - getLogger().warning( - String.format("Connection(%d) fail. Try reconnect...", tryConnect)); - } - }, 0L, 5L, TimeUnit.SECONDS); - } - - public void stopReconnect() { - if (sesFuture != null) { - sesFuture.cancel(false); - sesFuture = null; - tryConnect = 0; - } - } - - public void startPing(Channel channel) { - sesPingFuture = ses.scheduleAtFixedRate(() -> { - channel.write(new CS_Ping( - System.currentTimeMillis(), - 20.0D, //FIXME - getServer().getOnlinePlayers().size() - )); - if (channel.isWritable()) { - channel.flush(); - } else { - getLogger().warning("Lost connection!"); - channel.close(); - stopPing(); - - getLogger().warning("Try reconnect..."); - startReconnect(); - } - }, 0L, 5L, TimeUnit.SECONDS); - } - - public void stopPing() { - if (sesPingFuture != null) { - sesPingFuture.cancel(false); - } - } } diff --git a/bridge/src/main/java/asys/bridge/bukkit/ConfigBukkitImpl.java b/bridge/src/main/java/asys/bridge/bukkit/ConfigBukkitImpl.java new file mode 100644 index 0000000..be56291 --- /dev/null +++ b/bridge/src/main/java/asys/bridge/bukkit/ConfigBukkitImpl.java @@ -0,0 +1,26 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.bukkit; + +import asys.bridge.client.IConfig; +import org.bukkit.configuration.file.FileConfiguration; + +public class ConfigBukkitImpl implements IConfig { + private FileConfiguration fileConfiguration; + + public ConfigBukkitImpl(FileConfiguration fileConfiguration) { + this.fileConfiguration = fileConfiguration; + } + + @Override + public String getString(String path) { + return fileConfiguration.getString(path); + } + + @Override + public int getInt(String path) { + return fileConfiguration.getInt(path); + } +} diff --git a/bridge/src/main/java/asys/bridge/bukkit/LoggerBukkitImpl.java b/bridge/src/main/java/asys/bridge/bukkit/LoggerBukkitImpl.java new file mode 100644 index 0000000..53945d3 --- /dev/null +++ b/bridge/src/main/java/asys/bridge/bukkit/LoggerBukkitImpl.java @@ -0,0 +1,32 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.bukkit; + +import asys.bridge.client.ILogger; + +import java.util.logging.Logger; + +public class LoggerBukkitImpl implements ILogger { + private Logger logger; + + LoggerBukkitImpl(Logger logger) { + this.logger = logger; + } + + @Override + public void info(String string) { + logger.info(string); + } + + @Override + public void warn(String string) { + logger.warning(string); + } + + @Override + public void error(String string) { + logger.severe(string); + } +} diff --git a/bridge/src/main/java/asys/bridge/client/AbstractBridge.java b/bridge/src/main/java/asys/bridge/client/AbstractBridge.java new file mode 100644 index 0000000..2e8027c --- /dev/null +++ b/bridge/src/main/java/asys/bridge/client/AbstractBridge.java @@ -0,0 +1,80 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.client; + +import asys.mcsmanager.packets.CS_Ping; +import io.netty.channel.Channel; + +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; + +public abstract class AbstractBridge implements IBridge { + private Client client; + private ScheduledExecutorService ses; + private ScheduledFuture sesFuture, sesPingFuture; + private int tryConnect = 0; + + @Override + public void startReconnect() { + client = new Client(this); + ses = Executors.newScheduledThreadPool(2); + sesFuture = ses.scheduleAtFixedRate(() -> { + getLogger().info(String.format("Connect(%d) to ASys...", ++tryConnect)); + client.connect(getConfig().getString("host"), getConfig().getInt("port")); + if (client.isConnected()) { + stopReconnect(); + } else { + getLogger().warn(String.format("Connection(%d) fail. Try reconnect...", tryConnect)); + } + }, 0L, 5L, TimeUnit.SECONDS); + } + + @Override + public void stopReconnect() { + if (sesFuture != null) { + sesFuture.cancel(false); + sesFuture = null; + tryConnect = 0; + } + } + + @Override + public void startPing(Channel channel) { + sesPingFuture = ses.scheduleAtFixedRate(() -> { + channel.write(new CS_Ping( + System.currentTimeMillis(), + 20.0D, //FIXME fake tps + getCountOnlinePlayers() + )); + if (channel.isWritable()) { + channel.flush(); + } else { + getLogger().warn("Lost connection!"); + channel.close(); + stopPing(); + + getLogger().warn("Try reconnect..."); + startReconnect(); + } + }, 0L, 5L, TimeUnit.SECONDS); + } + + @Override + public void stopPing() { + if (sesPingFuture != null) { + sesPingFuture.cancel(false); + } + } + + @Override + public void disconnect() { + if (client.isConnected()) { + getLogger().info("Disconnect..."); + client.disconnect(); + } + } +} diff --git a/bridge/src/main/java/asys/bridge/client/Client.java b/bridge/src/main/java/asys/bridge/client/Client.java index df6fd0c..b9d354b 100644 --- a/bridge/src/main/java/asys/bridge/client/Client.java +++ b/bridge/src/main/java/asys/bridge/client/Client.java @@ -19,6 +19,11 @@ public class Client { private EventLoopGroup group; private Bootstrap bootstrap; private ChannelFuture channelFuture; + private IBridge bridge; + + public Client(IBridge bridge) { + this.bridge = bridge; + } public void connect(String host, int port) { if (group == null || bootstrap == null) { @@ -55,7 +60,7 @@ public class Client { new PacketEncoder(), new PacketDecoder(), new PacketHandler(), - new ClientPacketHandler() + new ClientPacketHandler(bridge) ); } }; diff --git a/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java b/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java index 94c145b..b490eb6 100644 --- a/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java +++ b/bridge/src/main/java/asys/bridge/client/ClientPacketHandler.java @@ -27,8 +27,10 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements private static final BiMap> pingPackets = ImmutableBiMap.of( 3, CS_Ping.class ); + private IBridge bridge; - ClientPacketHandler() { + ClientPacketHandler(IBridge bridge) { + this.bridge = bridge; if (handshakeHandlers == null) { handshakeHandlers = ImmutableMap.of( SC_HandshakeResult.class, this @@ -38,26 +40,24 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements @Override public void channelActive(ChannelHandlerContext context) throws Exception { - BridgePlugin.INSTANCE.getLogger().info("channelActive"); + bridge.getLogger().info("channelActive"); context.channel().attr(KNOWN_PACKETS).set(handshakePackets); context.channel().attr(KNOWN_HANDLERS).set(handshakeHandlers); CS_Handshake packet = new CS_Handshake( - BridgePlugin.INSTANCE.getConfig().getString("clientId"), - BridgePlugin.INSTANCE.getConfig().getString("passcode")); - BridgePlugin.INSTANCE.getLogger().info("send Handshake packet..."); + bridge.getConfig().getString("clientId"), + bridge.getConfig().getString("passcode")); + bridge.getLogger().info("send Handshake packet..."); context.channel().writeAndFlush(packet); super.channelActive(context); } @Override public void channelInactive(ChannelHandlerContext context) throws Exception { - if (BridgePlugin.INSTANCE != null) { - BridgePlugin.INSTANCE.getLogger().warning("Lost connection!"); - BridgePlugin.INSTANCE.stopPing(); - BridgePlugin.INSTANCE.getLogger().warning("Try reconnect..."); - BridgePlugin.INSTANCE.startReconnect(); - } + bridge.getLogger().warn("Lost connection!"); + bridge.stopPing(); + bridge.getLogger().warn("Try reconnect..."); + bridge.startReconnect(); context.channel().attr(KNOWN_PACKETS).remove(); context.channel().attr(KNOWN_HANDLERS).remove(); super.channelInactive(context); @@ -65,15 +65,15 @@ public class ClientPacketHandler extends ChannelInboundHandlerAdapter implements @Override public void handle(Packet packet, ChannelHandlerContext context) { - BridgePlugin.INSTANCE.getLogger().info("handle : " + packet.getClass().getSimpleName()); + bridge.getLogger().info("handle : " + packet.getClass().getSimpleName()); SC_HandshakeResult pkt = (SC_HandshakeResult) packet; if (pkt.getErrorCode() != 0) { - BridgePlugin.INSTANCE.getLogger().severe( + bridge.getLogger().error( String.format("Handshake: #%d %s", pkt.getErrorCode(), pkt.getMessage())); } else { context.channel().attr(KNOWN_PACKETS).set(pingPackets); - BridgePlugin.INSTANCE.getLogger().info("Handshake: OK"); - BridgePlugin.INSTANCE.startPing(context.channel()); + bridge.getLogger().info("Handshake: OK"); + bridge.startPing(context.channel()); } } } diff --git a/bridge/src/main/java/asys/bridge/client/IBridge.java b/bridge/src/main/java/asys/bridge/client/IBridge.java new file mode 100644 index 0000000..13bcaaf --- /dev/null +++ b/bridge/src/main/java/asys/bridge/client/IBridge.java @@ -0,0 +1,18 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.client; + +import io.netty.channel.Channel; + +public interface IBridge { + ILogger getLogger(); + IConfig getConfig(); + int getCountOnlinePlayers(); + void startReconnect(); + void stopReconnect(); + void startPing(Channel channel); + void stopPing(); + void disconnect(); +} diff --git a/bridge/src/main/java/asys/bridge/client/IConfig.java b/bridge/src/main/java/asys/bridge/client/IConfig.java new file mode 100644 index 0000000..fe1e084 --- /dev/null +++ b/bridge/src/main/java/asys/bridge/client/IConfig.java @@ -0,0 +1,10 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.client; + +public interface IConfig { + String getString(String path); + int getInt(String path); +} diff --git a/bridge/src/main/java/asys/bridge/client/ILogger.java b/bridge/src/main/java/asys/bridge/client/ILogger.java new file mode 100644 index 0000000..5d62261 --- /dev/null +++ b/bridge/src/main/java/asys/bridge/client/ILogger.java @@ -0,0 +1,11 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.client; + +public interface ILogger { + void info(String string); + void warn(String string); + void error(String string); +} diff --git a/bridge/src/main/java/asys/bridge/sponge/BridgeSponge.java b/bridge/src/main/java/asys/bridge/sponge/BridgeSponge.java index 16038c2..279a14c 100644 --- a/bridge/src/main/java/asys/bridge/sponge/BridgeSponge.java +++ b/bridge/src/main/java/asys/bridge/sponge/BridgeSponge.java @@ -4,14 +4,71 @@ */ package asys.bridge.sponge; +import com.google.inject.Inject; +import ninja.leaping.configurate.ConfigurationNode; +import ninja.leaping.configurate.loader.ConfigurationLoader; +import ninja.leaping.configurate.yaml.YAMLConfigurationLoader; +import org.slf4j.Logger; +import org.spongepowered.api.Sponge; import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.game.state.GameConstructionEvent; import org.spongepowered.api.plugin.Plugin; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.net.URLConnection; +import java.nio.file.Files; +import java.nio.file.Path; + @Plugin(id = "asysbridge", name = "ASysBridge", version = "0.6-SNAPSHOT") public class BridgeSponge { + @Inject + private Logger logger; + private ConfigurationNode configurationNode; + private BridgeSpongeImpl bridgeSponge; + @Listener - public void initPlugin(GameConstructionEvent event) { - // hello? + public void initPlugin(GameConstructionEvent event) throws IOException { + initConfig(); + this.bridgeSponge = new BridgeSpongeImpl(this); + this.bridgeSponge.startReconnect(); + } + + private void initConfig() throws IOException { + Path configPath = Sponge.getConfigManager().getPluginConfig(this).getConfigPath(); + if (!Files.exists(configPath)) { + saveDefaultConfig(configPath); + } + ConfigurationLoader loader = + YAMLConfigurationLoader.builder().setPath(configPath).build(); + configurationNode = loader.load(); + } + + Logger getLogger() { + return this.logger; + } + ConfigurationNode getConfigurationNode() { + return configurationNode; + } + + private void saveDefaultConfig(Path configPath) throws IOException { + URL configUrl = Sponge.getAssetManager().getAsset("config.yml").get().getUrl(); + URLConnection urlConnection = configUrl.openConnection(); + InputStream inputStream = urlConnection.getInputStream(); + if(!configPath.toFile().getParentFile().mkdirs()) { + if (!configPath.toFile().getParentFile().exists()) { + throw new IOException("Can't create folder: " + configPath.toFile().getParentFile().getAbsolutePath()); + } + } + FileOutputStream fileOutputStream = new FileOutputStream(configPath.toFile()); + byte[] buf = new byte[1024]; + int len; + while ((len = inputStream.read(buf)) > 0) { + fileOutputStream.write(buf, 0, len); + } + fileOutputStream.close(); + inputStream.close(); } } diff --git a/bridge/src/main/java/asys/bridge/sponge/BridgeSpongeImpl.java b/bridge/src/main/java/asys/bridge/sponge/BridgeSpongeImpl.java new file mode 100644 index 0000000..6f4d64a --- /dev/null +++ b/bridge/src/main/java/asys/bridge/sponge/BridgeSpongeImpl.java @@ -0,0 +1,35 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.sponge; + +import asys.bridge.client.AbstractBridge; +import asys.bridge.client.IBridge; +import asys.bridge.client.IConfig; +import asys.bridge.client.ILogger; + +public class BridgeSpongeImpl extends AbstractBridge implements IBridge { + private LoggerSpongeImpl loggerSponge; + private ConfigSpongeImpl configSponge; + + BridgeSpongeImpl(BridgeSponge spongePlugin) { + this.loggerSponge = new LoggerSpongeImpl(spongePlugin.getLogger()); + this.configSponge = new ConfigSpongeImpl(spongePlugin.getConfigurationNode()); + } + + @Override + public ILogger getLogger() { + return loggerSponge; + } + + @Override + public IConfig getConfig() { + return configSponge; + } + + @Override + public int getCountOnlinePlayers() { + return 0; //FIXME fake online + } +} diff --git a/bridge/src/main/java/asys/bridge/sponge/ConfigSpongeImpl.java b/bridge/src/main/java/asys/bridge/sponge/ConfigSpongeImpl.java new file mode 100644 index 0000000..d521cbf --- /dev/null +++ b/bridge/src/main/java/asys/bridge/sponge/ConfigSpongeImpl.java @@ -0,0 +1,26 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.sponge; + +import asys.bridge.client.IConfig; +import ninja.leaping.configurate.ConfigurationNode; + +public class ConfigSpongeImpl implements IConfig { + private ConfigurationNode configurationNode; + + ConfigSpongeImpl(ConfigurationNode configurationNode) { + this.configurationNode = configurationNode; + } + + @Override + public String getString(String path) { + return configurationNode.getNode(path).getString(); + } + + @Override + public int getInt(String path) { + return configurationNode.getNode(path).getInt(); + } +} diff --git a/bridge/src/main/java/asys/bridge/sponge/LoggerSpongeImpl.java b/bridge/src/main/java/asys/bridge/sponge/LoggerSpongeImpl.java new file mode 100644 index 0000000..fb13308 --- /dev/null +++ b/bridge/src/main/java/asys/bridge/sponge/LoggerSpongeImpl.java @@ -0,0 +1,31 @@ +/* + * DmitriyMX + * 2017-05-17 + */ +package asys.bridge.sponge; + +import asys.bridge.client.ILogger; +import org.slf4j.Logger; + +public class LoggerSpongeImpl implements ILogger { + private Logger logger; + + LoggerSpongeImpl(Logger logger) { + this.logger = logger; + } + + @Override + public void info(String string) { + logger.info(string); + } + + @Override + public void warn(String string) { + logger.warn(string); + } + + @Override + public void error(String string) { + logger.error(string); + } +} diff --git a/build.gradle b/build.gradle index 23f171a..b64c158 100644 --- a/build.gradle +++ b/build.gradle @@ -13,13 +13,13 @@ subprojects { } subprojects { - if (!it.name.startsWith('bridge')) { - ext { - slf4jVersion = '1.7.21' - } + ext { slf4jVersion = '1.7.21' } + dependencies { + compile group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion + } + if (!it.name.startsWith('bridge')) { dependencies { - compile group: 'org.slf4j', name: 'slf4j-api', version: slf4jVersion compile group: 'org.osgi', name: 'org.osgi.core', version: '6.0.0' } }