Database Driver downloading (#2144)

Affects issues:
- Fixed #1944
This commit is contained in:
Henri S 2021-10-31 13:16:47 +02:00 committed by GitHub
parent e4999ba072
commit efd3b75a29
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
17 changed files with 172 additions and 247 deletions

View File

@ -8,7 +8,6 @@ buildscript {
plugins {
id "com.github.johnrengelman.shadow" version "7.1.0" apply false
// id "io.github.slimjar" version "1.3.0" apply false
id "java"
id "jacoco"
id "checkstyle"
@ -49,7 +48,6 @@ logger.lifecycle("Building artifact for version $fullVersion")
subprojects {
// Build plugins
apply plugin: "com.github.johnrengelman.shadow"
// apply plugin: "io.github.slimjar"
apply plugin: "java"
apply plugin: "maven-publish"
@ -104,7 +102,6 @@ subprojects {
dependencies {
// Dependency Injection used across the project
// implementation "io.github.slimjar:slimjar:1.2.6" // Runtime dependency injection
implementation "com.google.dagger:dagger:$daggerVersion"
annotationProcessor "com.google.dagger:dagger-compiler:$daggerCompilerVersion"
testAnnotationProcessor "com.google.dagger:dagger-compiler:$daggerCompilerVersion"

View File

@ -61,22 +61,6 @@ public class Plan extends JavaPlugin implements PlanPlugin {
abstractionLayer = new BukkitPlatformLayer(this);
pluginLogger = abstractionLayer.getPluginLogger();
runnableFactory = abstractionLayer.getRunnableFactory();
// getLogger().log(Level.INFO, "Loading dependencies, this might take a while...");
// try {
// ApplicationBuilder.appending("Plan")
// .logger((message, args) -> getLogger().log(Level.INFO, message, args))
// // Use paper repository for downloading slimjar dependencies
// .internalRepositories(Collections.singletonList(new Repository(new URL("https://papermc.io/repo/repository/maven-public/"))))
// .downloadDirectoryPath(Paths.get(getDataFolder().getAbsolutePath()).resolve("libraries"))
// .build();
// } catch (IOException | ReflectiveOperationException | URISyntaxException | NoSuchAlgorithmException e) {
// String version = abstractionLayer.getPluginInformation().getVersion();
// getLogger().log(Level.SEVERE, e, () -> this.getClass().getSimpleName() + "-v" + version);
// getLogger().log(Level.SEVERE, "Plan failed to load its dependencies correctly!");
// getLogger().log(Level.SEVERE, "This error should be reported at https://github.com/plan-player-analytics/Plan/issues");
// onDisable();
// }
}
@Override
@ -230,4 +214,4 @@ public class Plan extends JavaPlugin implements PlanPlugin {
public PlanSystem getSystem() {
return system;
}
}
}

View File

@ -52,22 +52,6 @@ public class PlanBungee extends Plugin implements PlanPlugin {
abstractionLayer = new BungeePlatformLayer(this);
logger = abstractionLayer.getPluginLogger();
runnableFactory = abstractionLayer.getRunnableFactory();
// getLogger().log(Level.INFO, "Loading dependencies, this might take a while...");
// try {
// ApplicationBuilder.appending("Plan")
// .logger((message, args) -> getLogger().log(Level.INFO, message, args))
// // Use paper repository for downloading slimjar dependencies
// .internalRepositories(Collections.singletonList(new Repository(new URL("https://papermc.io/repo/repository/maven-public/"))))
// .downloadDirectoryPath(Paths.get(getDataFolder().getAbsolutePath()).resolve("libraries"))
// .build();
// } catch (IOException | ReflectiveOperationException | URISyntaxException | NoSuchAlgorithmException e) {
// String version = abstractionLayer.getPluginInformation().getVersion();
// getLogger().log(Level.SEVERE, e, () -> this.getClass().getSimpleName() + "-v" + version);
// getLogger().log(Level.SEVERE, "Plan failed to load its dependencies correctly!");
// getLogger().log(Level.SEVERE, "This error should be reported at https://github.com/plan-player-analytics/Plan/issues");
// onDisable();
// }
}
@Override

View File

@ -1,3 +1,32 @@
import dev.vankka.dependencydownload.task.GenerateDependencyDownloadResourceTask
plugins {
id "dev.vankka.dependencydownload.plugin" version "1.1.4"
}
configurations {
mysqlDriver
sqliteDriver
testImplementation.extendsFrom mysqlDriver, sqliteDriver
compileOnly.extendsFrom mysqlDriver, sqliteDriver
}
task generateResourceForMySQLDriver(type: GenerateDependencyDownloadResourceTask) {
var conf = configurations.mysqlDriver
configuration = conf
file = "assets/plan/dependencies/" + conf.name + ".txt"
// Not necessary to include in the resource
includeShadowJarRelocations = false
}
task generateResourceForSQLiteDriver(type: GenerateDependencyDownloadResourceTask) {
var conf = configurations.sqliteDriver
configuration = conf
file = "assets/plan/dependencies/" + conf.name + ".txt"
// Not necessary to include in the resource
includeShadowJarRelocations = false
}
dependencies {
implementation "net.playeranalytics:platform-abstraction-layer-api:$palVersion"
implementation project(":api")
@ -6,14 +35,18 @@ dependencies {
implementation "org.apache.commons:commons-text:$commonsTextVersion"
implementation "org.apache.commons:commons-compress:$commonsCompressVersion"
implementation "com.github.ben-manes.caffeine:caffeine:$caffeineVersion"
implementation "mysql:mysql-connector-java:$mysqlVersion"
implementation "org.xerial:sqlite-jdbc:$sqliteVersion"
implementation "com.zaxxer:HikariCP:$hikariVersion"
implementation "org.slf4j:slf4j-nop:$slf4jVersion"
implementation "org.slf4j:slf4j-api:$slf4jVersion"
implementation "com.maxmind.geoip2:geoip2:$geoIpVersion"
implementation "com.google.code.gson:gson:$gsonVersion"
// implementation slimjar("1.2.5")
implementation("dev.vankka.dependencydownload:runtime:1.1.4") {
// Effectively disables relocating
exclude module: "jar-relocator"
}
mysqlDriver "mysql:mysql-connector-java:$mysqlVersion"
sqliteDriver "org.xerial:sqlite-jdbc:$sqliteVersion"
testImplementation project(":api")
testImplementation "com.google.code.gson:gson:$gsonVersion"
@ -55,7 +88,7 @@ task determineWebAssetModifications {
}
processResources {
dependsOn determineWebAssetModifications
dependsOn determineWebAssetModifications, generateResourceForMySQLDriver, generateResourceForSQLiteDriver
duplicatesStrategy = DuplicatesStrategy.INCLUDE
dependsOn updateVersion
from 'build/sources/resources'
@ -96,4 +129,4 @@ shadowJar {
exclude "org/jayway/**/*"
exclude "google/protobuf/**/*"
exclude "jargs/gnu/**/*"
}
}

View File

@ -23,6 +23,7 @@ import com.djrapitops.plan.settings.config.PlanConfig;
import com.djrapitops.plan.settings.config.paths.DatabaseSettings;
import com.djrapitops.plan.settings.locale.Locale;
import com.djrapitops.plan.settings.locale.lang.PluginLang;
import com.djrapitops.plan.storage.file.PlanFiles;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import com.zaxxer.hikari.HikariConfig;
@ -34,11 +35,13 @@ import net.playeranalytics.plugin.server.PluginLogger;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.io.IOException;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Enumeration;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
@ -56,12 +59,13 @@ public class MySQLDB extends SQLDB {
public MySQLDB(
Locale locale,
PlanConfig config,
PlanFiles files,
Lazy<ServerInfo> serverInfo,
RunnableFactory runnableFactory,
PluginLogger pluginLogger,
ErrorLogger errorLogger
) {
super(() -> serverInfo.get().getServerUUID(), locale, config, runnableFactory, pluginLogger, errorLogger);
super(() -> serverInfo.get().getServerUUID(), locale, config, files, runnableFactory, pluginLogger, errorLogger);
}
private static synchronized void increment() {
@ -73,11 +77,12 @@ public class MySQLDB extends SQLDB {
return DBType.MYSQL;
}
private void loadMySQLDriver() {
@Override
protected List<String> getDependencyResource() {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
errorLogger.critical(e, ErrorContext.builder().whatToDo("Install MySQL Driver to the server").build());
return files.getResourceFromJar("dependencies/mysqlDriver.txt").asLines();
} catch (IOException e) {
throw new RuntimeException("Failed to get MySQL dependency information", e);
}
}
@ -86,9 +91,18 @@ public class MySQLDB extends SQLDB {
*/
@Override
public void setupDataSource() {
try {
loadMySQLDriver();
if (driverClassLoader == null) {
logger.info("Downloading MySQL Driver, this may take a while...");
downloadDriver();
}
Thread currentThread = Thread.currentThread();
ClassLoader previousClassLoader = currentThread.getContextClassLoader();
// Set the context class loader to the driver class loader for Hikari to use for finding the Driver
currentThread.setContextClassLoader(driverClassLoader);
try {
HikariConfig hikariConfig = new HikariConfig();
String host = config.get(DatabaseSettings.MYSQL_HOST);
@ -129,6 +143,9 @@ public class MySQLDB extends SQLDB {
} finally {
unloadMySQLDriver();
}
// Reset the context classloader back to what it was originally set to, now that the DataSource is created
currentThread.setContextClassLoader(previousClassLoader);
}
private void unloadMySQLDriver() {

View File

@ -32,9 +32,14 @@ import com.djrapitops.plan.storage.database.transactions.init.CreateTablesTransa
import com.djrapitops.plan.storage.database.transactions.init.OperationCriticalTransaction;
import com.djrapitops.plan.storage.database.transactions.init.RemoveIncorrectTebexPackageDataPatch;
import com.djrapitops.plan.storage.database.transactions.patches.*;
import com.djrapitops.plan.storage.file.PlanFiles;
import com.djrapitops.plan.utilities.java.ThrowableUtils;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import dev.vankka.dependencydownload.DependencyManager;
import dev.vankka.dependencydownload.classloader.IsolatedClassLoader;
import dev.vankka.dependencydownload.repository.Repository;
import dev.vankka.dependencydownload.repository.StandardRepository;
import net.playeranalytics.plugin.scheduling.PluginRunnable;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
import net.playeranalytics.plugin.scheduling.TimeAmount;
@ -43,10 +48,7 @@ import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Collections;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
import java.util.*;
import java.util.concurrent.*;
import java.util.function.Function;
import java.util.function.Supplier;
@ -58,14 +60,22 @@ import java.util.function.Supplier;
*/
public abstract class SQLDB extends AbstractDatabase {
private static final List<Repository> DRIVER_REPOSITORIES = Arrays.asList(
new StandardRepository("https://papermc.io/repo/repository/maven-public/"),
new StandardRepository("https://repo1.maven.org/maven2/")
);
private final Supplier<ServerUUID> serverUUIDSupplier;
protected final Locale locale;
protected final PlanConfig config;
protected final PlanFiles files;
protected final RunnableFactory runnableFactory;
protected final PluginLogger logger;
protected final ErrorLogger errorLogger;
protected IsolatedClassLoader driverClassLoader;
private Supplier<ExecutorService> transactionExecutorServiceProvider;
private ExecutorService transactionExecutor;
@ -73,6 +83,7 @@ public abstract class SQLDB extends AbstractDatabase {
Supplier<ServerUUID> serverUUIDSupplier,
Locale locale,
PlanConfig config,
PlanFiles files,
RunnableFactory runnableFactory,
PluginLogger logger,
ErrorLogger errorLogger
@ -80,6 +91,7 @@ public abstract class SQLDB extends AbstractDatabase {
this.serverUUIDSupplier = serverUUIDSupplier;
this.locale = locale;
this.config = config;
this.files = files;
this.runnableFactory = runnableFactory;
this.logger = logger;
this.errorLogger = errorLogger;
@ -98,6 +110,18 @@ public abstract class SQLDB extends AbstractDatabase {
};
}
protected abstract List<String> getDependencyResource();
public void downloadDriver() {
DependencyManager dependencyManager = new DependencyManager(files.getDataDirectory().resolve("libraries"));
dependencyManager.loadFromResource(getDependencyResource());
dependencyManager.download(null, DRIVER_REPOSITORIES);
IsolatedClassLoader classLoader = new IsolatedClassLoader();
dependencyManager.load(null, classLoader);
this.driverClassLoader = classLoader;
}
@Override
public void init() {
List<Runnable> unfinishedTransactions = closeTransactionExecutor(transactionExecutor);

View File

@ -25,7 +25,6 @@ import com.djrapitops.plan.storage.file.PlanFiles;
import com.djrapitops.plan.storage.upkeep.DBKeepAliveTask;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plan.utilities.SemaphoreAccessCounter;
import com.djrapitops.plan.utilities.logging.ErrorContext;
import com.djrapitops.plan.utilities.logging.ErrorLogger;
import dagger.Lazy;
import net.playeranalytics.plugin.scheduling.RunnableFactory;
@ -35,10 +34,14 @@ import net.playeranalytics.plugin.server.PluginLogger;
import javax.inject.Inject;
import javax.inject.Singleton;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.List;
import java.util.Objects;
import java.util.Properties;
/**
* @author AuroraLS3
@ -57,20 +60,32 @@ public class SQLiteDB extends SQLDB {
*/
private final SemaphoreAccessCounter connectionLock = new SemaphoreAccessCounter();
private Constructor<?> connectionConstructor;
private SQLiteDB(
File databaseFile,
Locale locale,
PlanConfig config,
PlanFiles files,
Lazy<ServerInfo> serverInfo,
RunnableFactory runnableFactory,
PluginLogger logger,
ErrorLogger errorLogger
) {
super(() -> serverInfo.get().getServerUUID(), locale, config, runnableFactory, logger, errorLogger);
super(() -> serverInfo.get().getServerUUID(), locale, config, files, runnableFactory, logger, errorLogger);
dbName = databaseFile.getName();
this.databaseFile = databaseFile;
}
@Override
protected List<String> getDependencyResource() {
try {
return files.getResourceFromJar("dependencies/sqliteDriver.txt").asLines();
} catch (IOException e) {
throw new RuntimeException("Failed to get SQLite dependency information", e);
}
}
@Override
public void setupDataSource() {
try {
@ -84,13 +99,10 @@ public class SQLiteDB extends SQLDB {
}
public Connection getNewConnection(File dbFile) throws SQLException {
try {
Class.forName("org.sqlite.JDBC");
} catch (ClassNotFoundException e) {
errorLogger.critical(e, ErrorContext.builder().whatToDo("Install SQLite Driver to the server").build());
return null;
if (driverClassLoader == null) {
logger.info("Downloading SQLite Driver, this may take a while...");
downloadDriver();
}
String dbFilePath = dbFile.getAbsolutePath();
Connection newConnection = getConnectionFor(dbFilePath);
@ -99,11 +111,42 @@ public class SQLiteDB extends SQLDB {
}
private Connection getConnectionFor(String dbFilePath) throws SQLException {
ensureConstructorIsAvailable();
return tryToConnect(dbFilePath, true);
}
private void ensureConstructorIsAvailable() {
if (connectionConstructor != null) {
return;
}
try {
return DriverManager.getConnection("jdbc:sqlite:" + dbFilePath + "?journal_mode=WAL");
} catch (SQLException ignored) {
Class<?> connectionClass = driverClassLoader.loadClass("org.sqlite.jdbc4.JDBC4Connection");
connectionConstructor = connectionClass.getConstructor(String.class, String.class, Properties.class);
} catch (ClassNotFoundException | NoSuchMethodException e) {
throw new DBInitException("Failed to initialize SQLite Driver", e);
}
}
private Connection tryToConnect(String dbFilePath, boolean withWAL) throws SQLException {
try {
Properties properties = new Properties();
if (withWAL) properties.put("journal_mode", "WAL");
return (Connection) connectionConstructor.newInstance("jdbc:sqlite:" + dbFilePath, dbFilePath, properties);
} catch (InvocationTargetException e) {
Throwable cause = e.getCause();
if (!withWAL && cause instanceof SQLException) {
throw (SQLException) cause;
} else if (!(cause instanceof SQLException)) {
throw new DBInitException("Failed to initialize SQLite Driver", cause);
}
// Run the method again with withWAL set to false, if it fails again, an exception will be thrown above
logger.info(locale.getString(PluginLang.DB_NOTIFY_SQLITE_WAL));
return DriverManager.getConnection("jdbc:sqlite:" + dbFilePath);
return tryToConnect(dbFilePath, false);
} catch (InstantiationException | IllegalAccessException e) {
throw new DBInitException("Failed to initialize SQLite Driver", e);
}
}
@ -216,7 +259,7 @@ public class SQLiteDB extends SQLDB {
public SQLiteDB usingFile(File databaseFile) {
return new SQLiteDB(databaseFile,
locale, config, serverInfo,
locale, config, files, serverInfo,
runnableFactory, logger, errorLogger1
);
}

View File

@ -35,6 +35,7 @@ public class OldDependencyCacheDeletionTask extends TaskSystem.Task {
private final File oldDependencyCache;
private final File dependencyCache;
private final File librariesCache;
private final ErrorLogger errorLogger;
@ -45,6 +46,7 @@ public class OldDependencyCacheDeletionTask extends TaskSystem.Task {
) {
oldDependencyCache = files.getDataDirectory().resolve("dependency_cache").toFile();
dependencyCache = files.getDataDirectory().resolve("dep_cache").toFile();
librariesCache = files.getDataDirectory().resolve("libraries").toFile();
this.errorLogger = errorLogger;
}
@ -58,6 +60,17 @@ public class OldDependencyCacheDeletionTask extends TaskSystem.Task {
public void run() {
tryToDeleteDirectory(oldDependencyCache);
tryToDeleteDirectory(dependencyCache);
if (librariesCache.exists()) {
// Only delete sub folders as jar files in the directory are still needed
File[] files = librariesCache.listFiles();
if (files == null) return;
for (File file : files) {
if (file.isDirectory()) {
tryToDeleteDirectory(file);
}
}
}
}
private void tryToDeleteDirectory(File directory) {

View File

@ -69,8 +69,8 @@
<!-- Metrics -->
<module name="ClassFanOutComplexity">
<!-- This value is high. Notable: SQLDB: 61 -->
<property name="max" value="65"/>
<!-- This value is high. Notable: SQLDB: 66 -->
<property name="max" value="70"/>
</module>
<module name="CyclomaticComplexity">
<!-- This value is high. Notable: ThemeConfig: 16 -->

View File

@ -49,11 +49,6 @@ processResources {
from 'build/sources/resources'
}
//slimJar {
// relocate 'com.mysql', 'plan.com.mysql'
// relocate 'com.google.protobuf', 'plan.com.mysql.cj.x.google.protobuf'
//}
shadowJar {
configurations = [project.configurations.shadow]
exclude('net.fabricmc:*')
@ -63,13 +58,13 @@ shadowJar {
exclude 'org/apache/logging/**'
}
relocate 'dagger', 'plan.dagger'
// Don't relocate SQLite since the org.sqlite.NativeDB class calls are not relocated properly
// Don't relocate MySQL or SQLite since they are loaded with a isolated class loader
// relocate 'org.sqlite', 'plan.org.sqlite'
// relocate 'com.mysql', 'plan.com.mysql'
// relocate 'com.google.protobuf', 'plan.com.mysql.cj.x.google.protobuf'
relocate 'javax.inject', 'plan.javax.inject'
relocate 'com.github.benmanes', 'plan.com.github.benmanes'
relocate 'com.mysql', 'plan.com.mysql'
relocate 'com.google.protobuf', 'plan.com.mysql.cj.x.google.protobuf'
relocate 'dev.vankka.dependencydownload', 'plan.dev.vankka.dependencydownload'
}
remapJar {

View File

@ -1,48 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package net.playeranalytics.plan;
import net.fabricmc.loader.launch.common.FabricLauncher;
import net.fabricmc.loader.launch.common.FabricLauncherBase;
import net.playeranalytics.plugin.server.FabricPluginLogger;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Paths;
/**
* Custom Injectable implementation for Fabric.
* Appends dependencies to the classpath via Fabric's own launcher.
*/
public class FabricInjectable /*implements Injectable*/ {
private final FabricLauncher launcher;
private final FabricPluginLogger pluginLogger;
public FabricInjectable(FabricPluginLogger pluginLogger) {
this.pluginLogger = pluginLogger;
this.launcher = FabricLauncherBase.getLauncher();
}
// @Override
public void inject(final URL url) throws IOException, InvocationTargetException, IllegalAccessException, URISyntaxException {
pluginLogger.info("Proposed " + Paths.get(url.toURI()).getFileName().toString() + " to classpath");
launcher.propose(url);
}
}

View File

@ -158,22 +158,6 @@ public class PlanFabric implements PlanPlugin, DedicatedServerModInitializer {
pluginLogger = (FabricPluginLogger) abstractionLayer.getPluginLogger();
runnableFactory = abstractionLayer.getRunnableFactory();
// pluginLogger.info("Loading dependencies, this might take a while...");
// try {
// ApplicationBuilder.injecting("Plan", new FabricInjectable(pluginLogger))
// .logger((message, args) -> pluginLogger.info(message, args))
// // Use paper repository for downloading slimjar dependencies
// .internalRepositories(Collections.singletonList(new Repository(new URL("https://papermc.io/repo/repository/maven-public/"))))
// .downloadDirectoryPath(Paths.get(getDataFolder().getAbsolutePath()).resolve("libraries"))
// .build();
// } catch (IOException | ReflectiveOperationException | URISyntaxException | NoSuchAlgorithmException e) {
// String version = abstractionLayer.getPluginInformation().getVersion();
// pluginLogger.error(this.getClass().getSimpleName() + "-v" + version, e);
// pluginLogger.error("Plan failed to load its dependencies correctly!");
// pluginLogger.error("This error should be reported at https://github.com/plan-player-analytics/Plan/issues");
// onDisable();
// }
ServerLifecycleEvents.SERVER_STARTING.register(server -> {
this.server = (MinecraftDedicatedServer) server;
onEnable();

View File

@ -66,22 +66,6 @@ public class PlanNukkit extends PluginBase implements PlanPlugin {
abstractionLayer = new NukkitPlatformLayer(this);
logger = abstractionLayer.getPluginLogger();
runnableFactory = abstractionLayer.getRunnableFactory();
// getLogger().info( "Loading dependencies, this might take a while...");
// try {
// ApplicationBuilder.appending("Plan")
// .logger((message, args) -> Logger.getGlobal().log(Level.INFO, message, args))
// // Use paper repository for downloading slimjar dependencies
// .internalRepositories(Collections.singletonList(new Repository(new URL("https://papermc.io/repo/repository/maven-public/"))))
// .downloadDirectoryPath(Paths.get(getDataFolder().getAbsolutePath()).resolve("libraries"))
// .build();
// } catch (IOException | ReflectiveOperationException | URISyntaxException | NoSuchAlgorithmException e) {
// String version = abstractionLayer.getPluginInformation().getVersion();
// Logger.getGlobal().log(Level.SEVERE, e, () -> this.getClass().getSimpleName() + "-v" + version);
// getLogger().error("Plan failed to load its dependencies correctly!");
// getLogger().error( "This error should be reported at https://github.com/plan-player-analytics/Plan/issues");
// onDisable();
// }
}
@Override
@ -210,4 +194,4 @@ public class PlanNukkit extends PluginBase implements PlanPlugin {
}).runTask();
}
}
}
}

View File

@ -13,22 +13,18 @@ dependencies {
testImplementation project(path: ":velocity", configuration: 'testArtifacts')
}
//slimJar {
// relocate 'com.mysql', 'plan.com.mysql'
// relocate 'com.google.protobuf', 'plan.com.mysql.cj.x.google.protobuf'
//}
shadowJar {
relocate('org.apache', 'plan.org.apache') {
exclude 'org/apache/logging/**'
}
relocate 'dagger', 'plan.dagger'
// Don't relocate SQLite since the org.sqlite.NativeDB class calls are not relocated properly
// Don't relocate MySQL or SQLite since they are loaded with a isolated class loader
// relocate 'org.sqlite', 'plan.org.sqlite'
// relocate 'com.mysql', 'plan.com.mysql'
// relocate 'com.google.protobuf', 'plan.com.mysql.cj.x.google.protobuf'
relocate 'javax.inject', 'plan.javax.inject'
relocate 'com.github.benmanes', 'plan.com.github.benmanes'
relocate 'com.mysql', 'plan.com.mysql'
relocate 'com.google.protobuf', 'plan.com.mysql.cj.x.google.protobuf'
relocate 'dev.vankka.dependencydownload', 'plan.dev.vankka.dependencydownload'
destinationDirectory.set(file("$rootDir/builds/"))
archiveBaseName.set('Plan')
@ -49,4 +45,4 @@ publishing {
artifact shadowJar
}
}
}
}

View File

@ -115,22 +115,6 @@ public class PlanSponge implements PlanPlugin {
abstractionLayer = new SpongePlatformLayer(this, dataFolder, slf4jLogger);
logger = abstractionLayer.getPluginLogger();
runnableFactory = abstractionLayer.getRunnableFactory();
// logger.info("Loading dependencies, this might take a while...");
// try {
// ApplicationBuilder.appending("Plan")
// .logger((message, args) -> java.util.logging.Logger.getGlobal().log(Level.INFO, message, args))
// // Use paper repository for downloading slimjar dependencies
// .internalRepositories(Collections.singletonList(new Repository(new URL("https://papermc.io/repo/repository/maven-public/"))))
// .downloadDirectoryPath(Paths.get(getDataFolder().getAbsolutePath()).resolve("libraries"))
// .build();
// } catch (IOException | ReflectiveOperationException | URISyntaxException | NoSuchAlgorithmException e) {
// String version = abstractionLayer.getPluginInformation().getVersion();
// java.util.logging.Logger.getGlobal().log(Level.SEVERE, e, () -> this.getClass().getSimpleName() + "-v" + version);
// logger.error("Plan failed to load its dependencies correctly!");
// logger.error("This error should be reported at https://github.com/plan-player-analytics/Plan/issues");
// onDisable();
// }
}
public void onEnable() {

View File

@ -91,22 +91,6 @@ public class PlanVelocity implements PlanPlugin {
logger = abstractionLayer.getPluginLogger();
runnableFactory = abstractionLayer.getRunnableFactory();
// logger.info("Loading dependencies, this might take a while...");
// try {
// ApplicationBuilder.injecting("Plan", new VelocityInjectable(this, proxy, logger))
// .logger((message, args) -> slf4jLogger.info(fixMsgParams(message), args))
// // Use paper repository for downloading slimjar dependencies
// .internalRepositories(Collections.singletonList(new Repository(new URL("https://papermc.io/repo/repository/maven-public/"))))
// .downloadDirectoryPath(Paths.get(getDataFolder().getAbsolutePath()).resolve("libraries"))
// .build();
// } catch (IOException | ReflectiveOperationException | URISyntaxException | NoSuchAlgorithmException e) {
// String version = abstractionLayer.getPluginInformation().getVersion();
// java.util.logging.Logger.getGlobal().log(Level.SEVERE, e, () -> this.getClass().getSimpleName() + "-v" + version);
// logger.error("Plan failed to load its dependencies correctly!");
// logger.error("This error should be reported at https://github.com/plan-player-analytics/Plan/issues");
// onDisable();
// }
onEnable();
}

View File

@ -1,49 +0,0 @@
/*
* This file is part of Player Analytics (Plan).
*
* Plan is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License v3 as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Plan is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Plan. If not, see <https://www.gnu.org/licenses/>.
*/
package com.djrapitops.plan;
import com.velocitypowered.api.proxy.ProxyServer;
import net.playeranalytics.plugin.server.PluginLogger;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.file.Paths;
/**
* Custom Injectable implementation for Velocity.
* Appends dependencies to the classpath via Velocity's internal methods.
*/
public class VelocityInjectable /*implements Injectable*/ {
private final PlanPlugin plugin;
private final ProxyServer proxyServer;
private final PluginLogger logger;
public VelocityInjectable(PlanPlugin plugin, ProxyServer proxyServer, PluginLogger logger) {
this.plugin = plugin;
this.proxyServer = proxyServer;
this.logger = logger;
}
// @Override
public void inject(URL url) throws IOException, InvocationTargetException, IllegalAccessException, URISyntaxException {
logger.info("Proposed " + Paths.get(url.toURI()).getFileName().toString() + " to classpath");
proxyServer.getPluginManager().addToClasspath(plugin, Paths.get(url.toURI()));
}
}