private Project createJbangProject(ResourceRef resourceRef) {
		Project prj = new Project(resourceRef);
		String contents = Util.readFileContent(resourceRef.getFile());
		TagReader tagReader = new TagReader.JbangProject(contents,
				it -> PropertiesValueResolver.replaceProperties(it, getContextProperties()));
		prj.setDescription(tagReader.getDescription().orElse(null));
		prj.setGav(tagReader.getGav().orElse(null));
		prj.setMainClass(tagReader.getMain().orElse(null));
		prj.setModuleName(tagReader.getModule().orElse(null));

		SourceSet ss = prj.getMainSourceSet();
		ss.addResources(tagReader.collectFiles(resourceRef,
				new SiblingResourceResolver(resourceRef, ResourceResolver.forResources())));
		ss.addDependencies(tagReader.collectBinaryDependencies());
		ss.addCompileOptions(tagReader.collectOptions("JAVAC_OPTIONS", "COMPILE_OPTIONS"));
		ss.addNativeOptions(tagReader.collectOptions("NATIVE_OPTIONS"));
		prj.addRepositories(tagReader.collectRepositories());
		prj.addRuntimeOptions(tagReader.collectOptions("JAVA_OPTIONS", "RUNTIME_OPTIONS"));
		tagReader.collectManifestOptions().forEach(kv -> {
			if (!kv.getKey().isEmpty()) {
				prj.getManifestAttributes().put(kv.getKey(), kv.getValue() != null ? kv.getValue() : "true");
			}
		});
		tagReader.collectAgentOptions().forEach(kv -> {
			if (!kv.getKey().isEmpty()) {
				prj.getManifestAttributes().put(kv.getKey(), kv.getValue() != null ? kv.getValue() : "true");
			}
		});
		String version = tagReader.getJavaVersion();
		if (version != null && JavaUtil.checkRequestedVersion(version)) {
			if (new JavaUtil.RequestedVersionComparator().compare(prj.getJavaVersion(), version) > 0) {
				prj.setJavaVersion(version);
			}
		}

		ResourceResolver resolver = getAliasResourceResolver(null);
		ResourceResolver siblingResolver = new SiblingResourceResolver(resourceRef, resolver);

		for (String srcDep : tagReader.collectSourceDependencies()) {
			ResourceRef subRef = resolver.resolve(srcDep, true);
			prj.addSubProject(new ProjectBuilder(buildRefs).build(subRef));
		}

		boolean first = true;
		for (Source includedSource : tagReader.collectSources(resourceRef, siblingResolver)) {
			updateProject(includedSource, prj, resolver);
			if (first) {
				prj.setMainSource(includedSource);
				first = false;
			}
		}

		return updateProject(prj);
	}
This class constructs a <code>Project</code>. It uses the options given by
the user on the command line or things that are part of the user's
environment.
src/main/java/dev/jbang/source/ProjectBuilder.java