private Result configureProjection() {
        if (projectionSourceTags.isEmpty()) {
            LOGGER.warning("No projection source tags were set for the projection `" + projection + "`, so the "
                    + "projection will not have any sources in it other than files found in the sources of "
                    + "the package being built.");
            String buildCp = String.join(System.getProperty(PATH_SEPARATOR), buildClasspath);
            return new Result(this, buildCp, buildCp, sources);
        }

        LOGGER.fine("Configuring Smithy classpaths for projection `" + projection + "`");

        // Find all JARs that have a matching tag and add them to sources.
        Set<String> computedSources = new LinkedHashSet<>(sources);
        Set<String> tagSourceJars = tagMatcher.findJarsWithMatchingTags(buildClasspath, projectionSourceTags);
        computedSources.addAll(tagSourceJars);
        LOGGER.info("Found the following JARs that matched the Smithy projection tags query: " + tagSourceJars);

        // Create a discovery classpath that ensures that sources (both explicit and
        // discovered through tags) are not added to the discovery classpath.
        Set<String> computedDiscovery = new LinkedHashSet<>(buildClasspath);
        computedDiscovery.removeAll(computedSources);

        String discoveryClasspath = String.join(System.getProperty(PATH_SEPARATOR), computedDiscovery);
        String classpath = String.join(System.getProperty(PATH_SEPARATOR), buildClasspath);
        return new Result(this, discoveryClasspath, classpath, computedSources);
    }
When a projection is applied, we build the model and discover models
using only the build tool classpath. This provides a layer of isolation
between the sources that created a projection from the downstream
consumers of the projected model.

@return Returns the result.
smithy-cli/src/main/java/software/amazon/smithy/cli/BuildParameterBuilder.java