Mirror von
https://github.com/PaperMC/Velocity.git
synchronisiert 2024-12-27 00:23:19 +01:00
Improved fix for #1372
Realized that the precondition that gets violated happens way too early, in `Maps.uniqueIndex()`.
Dieser Commit ist enthalten in:
Ursprung
6224adf70a
Commit
5154f02910
@ -86,43 +86,45 @@ public class VelocityPluginManager implements PluginManager {
|
|||||||
checkNotNull(directory, "directory");
|
checkNotNull(directory, "directory");
|
||||||
checkArgument(directory.toFile().isDirectory(), "provided path isn't a directory");
|
checkArgument(directory.toFile().isDirectory(), "provided path isn't a directory");
|
||||||
|
|
||||||
List<PluginDescription> found = new ArrayList<>();
|
Map<String, PluginDescription> foundCandidates = new LinkedHashMap<>();
|
||||||
JavaPluginLoader loader = new JavaPluginLoader(server, directory);
|
JavaPluginLoader loader = new JavaPluginLoader(server, directory);
|
||||||
|
|
||||||
try (DirectoryStream<Path> stream = Files.newDirectoryStream(directory,
|
try (DirectoryStream<Path> stream = Files.newDirectoryStream(directory,
|
||||||
p -> p.toFile().isFile() && p.toString().endsWith(".jar"))) {
|
p -> p.toFile().isFile() && p.toString().endsWith(".jar"))) {
|
||||||
for (Path path : stream) {
|
for (Path path : stream) {
|
||||||
try {
|
try {
|
||||||
found.add(loader.loadCandidate(path));
|
PluginDescription candidate = loader.loadCandidate(path);
|
||||||
|
|
||||||
|
// If we found a duplicate candidate (with the same ID), don't load it.
|
||||||
|
PluginDescription maybeExistingCandidate = foundCandidates.putIfAbsent(
|
||||||
|
candidate.getId(), candidate);
|
||||||
|
|
||||||
|
if (maybeExistingCandidate != null) {
|
||||||
|
logger.error("Refusing to load plugin at path {} since we already "
|
||||||
|
+ "loaded a plugin with the same ID {} from {}",
|
||||||
|
candidate.getSource().map(Objects::toString).orElse("<UNKNOWN>"),
|
||||||
|
candidate.getId(),
|
||||||
|
maybeExistingCandidate.getSource().map(Objects::toString).orElse("<UNKNOWN>"));
|
||||||
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
logger.error("Unable to load plugin {}", path, e);
|
logger.error("Unable to load plugin {}", path, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (found.isEmpty()) {
|
if (foundCandidates.isEmpty()) {
|
||||||
// No plugins found
|
// No plugins found
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
List<PluginDescription> sortedPlugins = PluginDependencyUtils.sortCandidates(found);
|
List<PluginDescription> sortedPlugins = PluginDependencyUtils.sortCandidates(
|
||||||
|
new ArrayList<>(foundCandidates.values()));
|
||||||
|
|
||||||
Map<String, PluginDescription> loadedCandidates = new HashMap<>();
|
Map<String, PluginDescription> loadedCandidates = new HashMap<>();
|
||||||
Map<PluginContainer, Module> pluginContainers = new LinkedHashMap<>();
|
Map<PluginContainer, Module> pluginContainers = new LinkedHashMap<>();
|
||||||
// Now load the plugins
|
// Now load the plugins
|
||||||
pluginLoad:
|
pluginLoad:
|
||||||
for (PluginDescription candidate : sortedPlugins) {
|
for (PluginDescription candidate : sortedPlugins) {
|
||||||
// If we found a duplicate candidate (with the same ID), don't load it.
|
|
||||||
PluginDescription existingCandidate = loadedCandidates.get(candidate.getId());
|
|
||||||
if (existingCandidate != null) {
|
|
||||||
logger.error("Refusing to load plugin at path {} since we already "
|
|
||||||
+ "loaded a plugin with the same ID {} from {}",
|
|
||||||
candidate.getSource().map(Objects::toString).orElse("<UNKNOWN>"),
|
|
||||||
candidate.getId(),
|
|
||||||
existingCandidate.getSource().map(Objects::toString).orElse("<UNKNOWN>"));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify dependencies
|
// Verify dependencies
|
||||||
for (PluginDependency dependency : candidate.getDependencies()) {
|
for (PluginDependency dependency : candidate.getDependencies()) {
|
||||||
if (!dependency.isOptional() && !loadedCandidates.containsKey(dependency.getId())) {
|
if (!dependency.isOptional() && !loadedCandidates.containsKey(dependency.getId())) {
|
||||||
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren