mirror of https://github.com/Minestom/Minestom.git
Fix extension subdependencies not being loaded + Test that J9 modules are supported
This commit is contained in:
parent
9ce7a08d12
commit
6addd63396
|
@ -105,6 +105,9 @@ dependencies {
|
|||
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.6.2'
|
||||
testRuntimeOnly('org.junit.jupiter:junit-jupiter-engine:5.6.2')
|
||||
|
||||
// Only here to ensure J9 module support for extensions and our classloaders
|
||||
testCompileOnly "org.mockito:mockito-core:2.28.2"
|
||||
|
||||
// Netty
|
||||
api 'io.netty:netty-handler:4.1.58.Final'
|
||||
api 'io.netty:netty-codec:4.1.58.Final'
|
||||
|
|
|
@ -2,6 +2,7 @@ package net.minestom.server.extensions;
|
|||
|
||||
import com.google.gson.Gson;
|
||||
import net.minestom.dependencies.DependencyGetter;
|
||||
import net.minestom.dependencies.ResolvedDependency;
|
||||
import net.minestom.dependencies.maven.MavenRepository;
|
||||
import net.minestom.server.MinecraftServer;
|
||||
import net.minestom.server.extras.selfmodification.MinestomExtensionClassLoader;
|
||||
|
@ -402,13 +403,13 @@ public class ExtensionManager {
|
|||
|
||||
for (var artifact : externalDependencies.artifacts) {
|
||||
var resolved = getter.get(artifact, dependenciesFolder);
|
||||
addDependencyFile(resolved.getContentsLocation(), ext);
|
||||
addDependencyFile(resolved, ext);
|
||||
LOGGER.trace("Dependency of extension {}: {}", ext.getName(), resolved);
|
||||
}
|
||||
|
||||
for (var dependencyName : ext.getDependencies()) {
|
||||
var resolved = getter.get(dependencyName, dependenciesFolder);
|
||||
addDependencyFile(resolved.getContentsLocation(), ext);
|
||||
addDependencyFile(resolved, ext);
|
||||
LOGGER.trace("Dependency of extension {}: {}", ext.getName(), resolved);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
|
@ -420,9 +421,19 @@ public class ExtensionManager {
|
|||
}
|
||||
}
|
||||
|
||||
private void addDependencyFile(URL dependency, DiscoveredExtension extension) {
|
||||
extension.files.add(dependency);
|
||||
LOGGER.trace("Added dependency {} to extension {} classpath", dependency.toExternalForm(), extension.getName());
|
||||
private void addDependencyFile(ResolvedDependency dependency, DiscoveredExtension extension) {
|
||||
URL location = dependency.getContentsLocation();
|
||||
extension.files.add(location);
|
||||
LOGGER.trace("Added dependency {} to extension {} classpath", location.toExternalForm(), extension.getName());
|
||||
|
||||
// recurse to add full dependency tree
|
||||
if(!dependency.getSubdependencies().isEmpty()) {
|
||||
LOGGER.trace("Dependency {} has subdependencies, adding...", location.toExternalForm());
|
||||
for(ResolvedDependency sub : dependency.getSubdependencies()) {
|
||||
addDependencyFile(sub, extension);
|
||||
}
|
||||
LOGGER.trace("Dependency {} has had its subdependencies added.", location.toExternalForm());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
package improveextensions;
|
||||
|
||||
import net.minestom.server.MinecraftServer;
|
||||
import net.minestom.server.extensions.Extension;
|
||||
import net.minestom.server.instance.InstanceContainer;
|
||||
import net.minestom.server.world.DimensionType;
|
||||
import org.junit.jupiter.api.Assertions;
|
||||
import org.opentest4j.AssertionFailedError;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.UUID;
|
||||
|
||||
import static org.mockito.Mockito.mock;
|
||||
import static org.mockito.Mockito.when;
|
||||
|
||||
/**
|
||||
* Extensions should be able to use Mixins for classes loaded very early by Minestom (InstanceContainer for instance)
|
||||
*/
|
||||
public class MixinIntoMinestomCoreWithJava9ModuleOnClasspath extends Extension {
|
||||
|
||||
@Override
|
||||
public void initialize() {
|
||||
// use Mockito only to ensure J9 modules on the classpath are supported
|
||||
List mockedList = mock(List.class);
|
||||
when(mockedList.get(0)).thenReturn("Test");
|
||||
// force load of InstanceContainer class
|
||||
InstanceContainer c = new InstanceContainer(UUID.randomUUID(), DimensionType.OVERWORLD, null);
|
||||
System.out.println(c.toString());
|
||||
try {
|
||||
Assertions.assertTrue(MixinIntoMinestomCore.success, "InstanceContainer must have been mixed in with improveextensions.InstanceContainerMixin");
|
||||
Assertions.assertEquals(1, MinecraftServer.getExtensionManager().getExtensionLoaders().size(), "Only one extension classloader (this extension's) must be active.");
|
||||
Assertions.assertEquals("Test", mockedList.get(0));
|
||||
} catch (AssertionFailedError e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
MinecraftServer.stopCleanly();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void terminate() {
|
||||
getLogger().info("Terminate extension");
|
||||
}
|
||||
}
|
|
@ -0,0 +1,14 @@
|
|||
{
|
||||
"entrypoint": "improveextensions.MixinIntoMinestomCoreWithJava9ModuleOnClasspath",
|
||||
"name": "MixinIntoMinestomCoreWithJava9ModuleOnClasspath",
|
||||
"codeModifiers": [],
|
||||
"mixinConfig": "mixins.minestomcore.json",
|
||||
"externalDependencies": {
|
||||
"repositories": [
|
||||
{"name": "JCentral", "url": "https://jcenter.bintray.com/"}
|
||||
],
|
||||
"artifacts": [
|
||||
"org.mockito:mockito-core:2.28.2"
|
||||
]
|
||||
}
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
{
|
||||
"required": true,
|
||||
"minVersion": "0.8",
|
||||
"package": "improveextensions.mixins",
|
||||
"target": "@env(DEFAULT)",
|
||||
"compatibilityLevel": "JAVA_11",
|
||||
"mixins": [
|
||||
"InstanceContainerMixin"
|
||||
]
|
||||
}
|
Loading…
Reference in New Issue