@Override
	public IntegrationResult build() throws IOException {
		// todo: setting properties to avoid loosing properties in integration call.
		Project project = ctx.getProject();
		Properties oldProps = System.getProperties();
		Properties tempProps = new Properties();
		tempProps.putAll(oldProps);
		System.setProperties(tempProps);
		for (Map.Entry<String, String> entry : project.getProperties().entrySet()) {
			System.setProperty(entry.getKey(), entry.getValue());
		}
		try {
			IntegrationResult integrationResult = IntegrationManager.runIntegrations(ctx);

			if (project.getMainClass() == null) { // if non-null user forced set main
				if (integrationResult.mainClass != null) {
					project.setMainClass(integrationResult.mainClass);
				}
			}
			if (integrationResult.javaArgs != null && !integrationResult.javaArgs.isEmpty()) {
				// Add integration options to the java options
				project.addRuntimeOptions(integrationResult.javaArgs);
			}
			return integrationResult;
		} finally {
			System.setProperties(oldProps);
		}
	}
This class takes a <code>Project</code> and the result of a previous
"compile" step and runs any integrations that might be found. Those
integration can make changes to the project that will be used as the input
for the next build step.
src/main/java/dev/jbang/source/buildsteps/IntegrationBuildStep.java