Exclude client only libraries in server run task.
This commit is contained in:
		
							parent
							
								
									15afb45769
								
							
						
					
					
						commit
						03d3950d11
					
				
					 4 changed files with 60 additions and 34 deletions
				
			
		|  | @ -24,14 +24,18 @@ | ||||||
| 
 | 
 | ||||||
| package net.fabricmc.loom.configuration.ide; | package net.fabricmc.loom.configuration.ide; | ||||||
| 
 | 
 | ||||||
|  | import java.io.File; | ||||||
| import java.io.IOException; | import java.io.IOException; | ||||||
| import java.io.InputStream; | import java.io.InputStream; | ||||||
| import java.nio.charset.StandardCharsets; | import java.nio.charset.StandardCharsets; | ||||||
| import java.nio.file.Path; | import java.nio.file.Path; | ||||||
| import java.util.ArrayList; | import java.util.ArrayList; | ||||||
|  | import java.util.Collections; | ||||||
|  | import java.util.LinkedList; | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Map; | import java.util.Map; | ||||||
| import java.util.Objects; | import java.util.Objects; | ||||||
|  | import java.util.Set; | ||||||
| 
 | 
 | ||||||
| import com.google.common.collect.ImmutableMap; | import com.google.common.collect.ImmutableMap; | ||||||
| import com.google.gson.JsonElement; | import com.google.gson.JsonElement; | ||||||
|  | @ -46,6 +50,8 @@ import org.w3c.dom.Node; | ||||||
| import net.fabricmc.loom.LoomGradleExtension; | import net.fabricmc.loom.LoomGradleExtension; | ||||||
| import net.fabricmc.loom.configuration.InstallerData; | import net.fabricmc.loom.configuration.InstallerData; | ||||||
| import net.fabricmc.loom.configuration.ide.idea.IdeaSyncTask; | import net.fabricmc.loom.configuration.ide.idea.IdeaSyncTask; | ||||||
|  | import net.fabricmc.loom.configuration.providers.BundleMetadata; | ||||||
|  | import net.fabricmc.loom.util.Constants; | ||||||
| 
 | 
 | ||||||
| public class RunConfig { | public class RunConfig { | ||||||
| 	public String configName; | 	public String configName; | ||||||
|  | @ -54,6 +60,7 @@ public class RunConfig { | ||||||
| 	public String mainClass; | 	public String mainClass; | ||||||
| 	public String runDirIdeaUrl; | 	public String runDirIdeaUrl; | ||||||
| 	public String runDir; | 	public String runDir; | ||||||
|  | 	public String environment; | ||||||
| 	public List<String> vmArgs = new ArrayList<>(); | 	public List<String> vmArgs = new ArrayList<>(); | ||||||
| 	public List<String> programArgs = new ArrayList<>(); | 	public List<String> programArgs = new ArrayList<>(); | ||||||
| 	public SourceSet sourceSet; | 	public SourceSet sourceSet; | ||||||
|  | @ -163,6 +170,7 @@ public class RunConfig { | ||||||
| 		runConfig.runDirIdeaUrl = "file://$PROJECT_DIR$/" + runDir; | 		runConfig.runDirIdeaUrl = "file://$PROJECT_DIR$/" + runDir; | ||||||
| 		runConfig.runDir = runDir; | 		runConfig.runDir = runDir; | ||||||
| 		runConfig.sourceSet = sourceSet; | 		runConfig.sourceSet = sourceSet; | ||||||
|  | 		runConfig.environment = environment; | ||||||
| 
 | 
 | ||||||
| 		// Custom parameters | 		// Custom parameters | ||||||
| 		runConfig.programArgs.addAll(settings.getProgramArgs()); | 		runConfig.programArgs.addAll(settings.getProgramArgs()); | ||||||
|  | @ -251,6 +259,31 @@ public class RunConfig { | ||||||
| 		return defaultMainClass; | 		return defaultMainClass; | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	public List<String> getExcludedLibraryPaths(Project project) { | ||||||
|  | 		if (!environment.equals("server")) { | ||||||
|  | 			return Collections.emptyList(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		final BundleMetadata bundleMetadata = LoomGradleExtension.get(project).getMinecraftProvider().getServerBundleMetadata(); | ||||||
|  | 
 | ||||||
|  | 		if (bundleMetadata == null) { | ||||||
|  | 			// Legacy version | ||||||
|  | 			return Collections.emptyList(); | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		final Set<File> allLibraries = project.getConfigurations().getByName(Constants.Configurations.MINECRAFT_DEPENDENCIES).getFiles(); | ||||||
|  | 		final Set<File> serverLibraries = project.getConfigurations().getByName(Constants.Configurations.MINECRAFT_SERVER_DEPENDENCIES).getFiles(); | ||||||
|  | 		final List<String> clientOnlyLibraries = new LinkedList<>(); | ||||||
|  | 
 | ||||||
|  | 		for (File commonLibrary : allLibraries) { | ||||||
|  | 			if (!serverLibraries.contains(commonLibrary)) { | ||||||
|  | 				clientOnlyLibraries.add(commonLibrary.getAbsolutePath()); | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 
 | ||||||
|  | 		return clientOnlyLibraries; | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	private static String encodeEscaped(String s) { | 	private static String encodeEscaped(String s) { | ||||||
| 		StringBuilder ret = new StringBuilder(); | 		StringBuilder ret = new StringBuilder(); | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -31,10 +31,7 @@ import java.io.StringWriter; | ||||||
| import java.nio.charset.StandardCharsets; | import java.nio.charset.StandardCharsets; | ||||||
| import java.nio.file.Files; | import java.nio.file.Files; | ||||||
| import java.nio.file.Path; | import java.nio.file.Path; | ||||||
| import java.util.Collections; |  | ||||||
| import java.util.LinkedList; |  | ||||||
| import java.util.List; | import java.util.List; | ||||||
| import java.util.Set; |  | ||||||
| 
 | 
 | ||||||
| import javax.inject.Inject; | import javax.inject.Inject; | ||||||
| import javax.xml.parsers.DocumentBuilder; | import javax.xml.parsers.DocumentBuilder; | ||||||
|  | @ -57,9 +54,7 @@ import org.xml.sax.InputSource; | ||||||
| import net.fabricmc.loom.LoomGradleExtension; | import net.fabricmc.loom.LoomGradleExtension; | ||||||
| import net.fabricmc.loom.configuration.ide.RunConfig; | import net.fabricmc.loom.configuration.ide.RunConfig; | ||||||
| import net.fabricmc.loom.configuration.ide.RunConfigSettings; | import net.fabricmc.loom.configuration.ide.RunConfigSettings; | ||||||
| import net.fabricmc.loom.configuration.providers.BundleMetadata; |  | ||||||
| import net.fabricmc.loom.task.AbstractLoomTask; | import net.fabricmc.loom.task.AbstractLoomTask; | ||||||
| import net.fabricmc.loom.util.Constants; |  | ||||||
| 
 | 
 | ||||||
| public abstract class IdeaSyncTask extends AbstractLoomTask { | public abstract class IdeaSyncTask extends AbstractLoomTask { | ||||||
| 	@Inject | 	@Inject | ||||||
|  | @ -90,8 +85,6 @@ public abstract class IdeaSyncTask extends AbstractLoomTask { | ||||||
| 			runConfigsDir.mkdirs(); | 			runConfigsDir.mkdirs(); | ||||||
| 		} | 		} | ||||||
| 
 | 
 | ||||||
| 		final List<String> excludedServerLibraries = getExcludedServerLibraries(); |  | ||||||
| 
 |  | ||||||
| 		for (RunConfigSettings settings : extension.getRunConfigs()) { | 		for (RunConfigSettings settings : extension.getRunConfigs()) { | ||||||
| 			if (!settings.isIdeConfigGenerated()) { | 			if (!settings.isIdeConfigGenerated()) { | ||||||
| 				continue; | 				continue; | ||||||
|  | @ -109,9 +102,11 @@ public abstract class IdeaSyncTask extends AbstractLoomTask { | ||||||
| 
 | 
 | ||||||
| 			settings.makeRunDir(); | 			settings.makeRunDir(); | ||||||
| 
 | 
 | ||||||
| 			if (settings.getEnvironment().equals("server") && !excludedServerLibraries.isEmpty()) { | 			final List<String> excludedLibraryPaths = config.getExcludedLibraryPaths(getProject()); | ||||||
|  | 
 | ||||||
|  | 			if (!excludedLibraryPaths.isEmpty()) { | ||||||
| 				try { | 				try { | ||||||
| 					setClasspathModifications(runConfigs.toPath(), excludedServerLibraries); | 					setClasspathModifications(runConfigs.toPath(), excludedLibraryPaths); | ||||||
| 				} catch (Exception e) { | 				} catch (Exception e) { | ||||||
| 					getProject().getLogger().error("Failed to modify run configuration xml", e); | 					getProject().getLogger().error("Failed to modify run configuration xml", e); | ||||||
| 				} | 				} | ||||||
|  | @ -119,27 +114,6 @@ public abstract class IdeaSyncTask extends AbstractLoomTask { | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
| 	private List<String> getExcludedServerLibraries() { |  | ||||||
| 		final BundleMetadata bundleMetadata = getExtension().getMinecraftProvider().getServerBundleMetadata(); |  | ||||||
| 
 |  | ||||||
| 		if (bundleMetadata == null) { |  | ||||||
| 			// Legacy version |  | ||||||
| 			return Collections.emptyList(); |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		final Set<File> allLibraries = getProject().getConfigurations().getByName(Constants.Configurations.MINECRAFT_DEPENDENCIES).getFiles(); |  | ||||||
| 		final Set<File> serverLibraries = getProject().getConfigurations().getByName(Constants.Configurations.MINECRAFT_SERVER_DEPENDENCIES).getFiles(); |  | ||||||
| 		final List<String> clientOnlyLibraries = new LinkedList<>(); |  | ||||||
| 
 |  | ||||||
| 		for (File commonLibrary : allLibraries) { |  | ||||||
| 			if (!serverLibraries.contains(commonLibrary)) { |  | ||||||
| 				clientOnlyLibraries.add(commonLibrary.getAbsolutePath()); |  | ||||||
| 			} |  | ||||||
| 		} |  | ||||||
| 
 |  | ||||||
| 		return clientOnlyLibraries; |  | ||||||
| 	} |  | ||||||
| 
 |  | ||||||
| 	private void setClasspathModifications(Path runConfig, List<String> exclusions) throws IOException { | 	private void setClasspathModifications(Path runConfig, List<String> exclusions) throws IOException { | ||||||
| 		if (!IdeaUtils.supportsCustomizableClasspath()) { | 		if (!IdeaUtils.supportsCustomizableClasspath()) { | ||||||
| 			return; | 			return; | ||||||
|  |  | ||||||
|  | @ -31,6 +31,7 @@ import java.util.List; | ||||||
| import java.util.function.Function; | import java.util.function.Function; | ||||||
| 
 | 
 | ||||||
| import org.gradle.api.Project; | import org.gradle.api.Project; | ||||||
|  | import org.gradle.api.specs.Spec; | ||||||
| import org.gradle.api.tasks.JavaExec; | import org.gradle.api.tasks.JavaExec; | ||||||
| 
 | 
 | ||||||
| import net.fabricmc.loom.configuration.ide.RunConfig; | import net.fabricmc.loom.configuration.ide.RunConfig; | ||||||
|  | @ -44,7 +45,7 @@ public abstract class AbstractRunTask extends JavaExec { | ||||||
| 		setGroup(Constants.TaskGroup.FABRIC); | 		setGroup(Constants.TaskGroup.FABRIC); | ||||||
| 		this.config = configProvider.apply(getProject()); | 		this.config = configProvider.apply(getProject()); | ||||||
| 
 | 
 | ||||||
| 		setClasspath(config.sourceSet.getRuntimeClasspath()); | 		setClasspath(config.sourceSet.getRuntimeClasspath().filter(new LibraryFilter())); | ||||||
| 		args(config.programArgs); | 		args(config.programArgs); | ||||||
| 		getMainClass().set(config.mainClass); | 		getMainClass().set(config.mainClass); | ||||||
| 	} | 	} | ||||||
|  | @ -72,4 +73,22 @@ public abstract class AbstractRunTask extends JavaExec { | ||||||
| 		args.addAll(config.vmArgs); | 		args.addAll(config.vmArgs); | ||||||
| 		return args; | 		return args; | ||||||
| 	} | 	} | ||||||
|  | 
 | ||||||
|  | 	private class LibraryFilter implements Spec<File> { | ||||||
|  | 		private List<String> excludedLibraryPaths = null; | ||||||
|  | 
 | ||||||
|  | 		@Override | ||||||
|  | 		public boolean isSatisfiedBy(File element) { | ||||||
|  | 			if (excludedLibraryPaths == null) { | ||||||
|  | 				excludedLibraryPaths = config.getExcludedLibraryPaths(getProject()); | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			if (excludedLibraryPaths.contains(element.getAbsolutePath())) { | ||||||
|  | 				getProject().getLogger().debug("Excluding library {} from {} run config", element.getName(), config.configName); | ||||||
|  | 				return false; | ||||||
|  | 			} | ||||||
|  | 
 | ||||||
|  | 			return true; | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -31,7 +31,7 @@ archivesBaseName = "fabric-example-mod" | ||||||
| version = "1.0.0" | version = "1.0.0" | ||||||
| 
 | 
 | ||||||
| dependencies { | dependencies { | ||||||
| 	minecraft "com.mojang:minecraft:1.16.5" | 	minecraft "com.mojang:minecraft:1.18.1" | ||||||
| 	mappings "net.fabricmc:yarn:1.16.5+build.5:v2" | 	mappings "net.fabricmc:yarn:1.18.1+build.12:v2" | ||||||
| 	modImplementation "net.fabricmc:fabric-loader:0.11.2" | 	modImplementation "net.fabricmc:fabric-loader:0.12.12" | ||||||
| } | } | ||||||
		Loading…
	
		Reference in a new issue