Skip to content
Commits on Source (8)
gradle-debian-helper (2.0) unstable; urgency=medium
* Team upload.
* Changed the dependency interception logic to use a hook called from Gradle's
Maven resolver. This avoids depending on Gradle internal classes and reduces
the risk of incompatibilities when upgrading Gradle.
* Removed the recommended dependency on debhelper
* Standards-Version updated to 4.2.1
* Use salsa.debian.org Vcs-* URLs
-- Emmanuel Bourg <ebourg@apache.org> Sun, 16 Sep 2018 16:12:11 +0200
gradle-debian-helper (1.6) unstable; urgency=medium
* Team upload.
......
......@@ -2,17 +2,25 @@ Source: gradle-debian-helper
Section: java
Priority: optional
Maintainer: Debian Java Maintainers <pkg-java-maintainers@lists.alioth.debian.org>
Uploaders: Emmanuel Bourg <ebourg@apache.org>,
Uploaders:
Emmanuel Bourg <ebourg@apache.org>,
Kai-Chung Yan <seamlikok@gmail.com>
Build-Depends: debhelper (>= 10), default-jdk-headless | default-jdk, maven-debian-helper, gradle (>= 3.2)
Standards-Version: 4.1.0
Vcs-Git: https://anonscm.debian.org/git/pkg-java/gradle-debian-helper.git
Vcs-Browser: https://anonscm.debian.org/cgit/pkg-java/gradle-debian-helper.git
Build-Depends:
debhelper (>= 10),
default-jdk-headless | default-jdk,
gradle (>= 3.2),
maven-debian-helper
Standards-Version: 4.2.1
Vcs-Git: https://salsa.debian.org/java-team/gradle-debian-helper.git
Vcs-Browser: https://salsa.debian.org/java-team/gradle-debian-helper
Package: gradle-debian-helper
Architecture: all
Depends: ${misc:Depends}, default-jre-headless | java7-runtime-headless, maven-repo-helper, gradle (>= 3.2)
Recommends: debhelper
Depends:
default-jre-headless | java7-runtime-headless,
gradle (>= 3.4.1-8~),
maven-repo-helper,
${misc:Depends}
Description: Helper tools for building Debian packages with Gradle
gradle-debian-helper contains helper tools to ease the packaging of Gradle
based projects in Debian. It consists in:
......
......@@ -26,5 +26,6 @@
# Empty by default. [mh_install]
#
pom.xml --has-package-version
gradle-helper-hook/pom.xml --has-package-version --java-lib
gradle-helper-plugin/pom.xml --has-package-version --java-lib
gradle-dependency-placeholder/pom.xml --has-package-version --java-lib
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.debian.gradle</groupId>
<artifactId>gradle-helper-hook</artifactId>
<version>1.5</version>
<packaging>jar</packaging>
<name>Gradle Debian Helper Hook</name>
<description>Gradle hook for resolving project dependencies with the system Maven repository</description>
<dependencies>
<dependency>
<groupId>org.debian.maven</groupId>
<artifactId>maven-repo-helper</artifactId>
<version>1.8.10</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.5</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
/**
* Copyright 2015 Emmanuel Bourg
* Copyright 2018 Emmanuel Bourg
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
......@@ -14,110 +14,69 @@
* limitations under the License.
*/
package org.debian.gradle;
package org.debian.gradle.plugin;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.debian.maven.cliargs.ArgumentsIterable;
import org.debian.maven.cliargs.ArgumentsMap;
import org.debian.maven.repo.Dependency;
import org.debian.maven.repo.DependencyRule;
import org.debian.maven.repo.DependencyRuleSetFiles;
import org.gradle.api.artifacts.component.ModuleComponentIdentifier;
import org.gradle.api.internal.artifacts.ivyservice.ArtifactCacheMetaData;
import org.gradle.api.internal.artifacts.ivyservice.DefaultArtifactCacheMetaData;
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.ConfiguredModuleComponentRepository;
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.parser.GradlePomModuleDescriptorParser;
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.DefaultVersionComparator;
import org.gradle.api.internal.artifacts.ivyservice.ivyresolve.strategy.DefaultVersionSelectorScheme;
import org.gradle.api.internal.artifacts.mvnsettings.DefaultLocalMavenRepositoryLocator;
import org.gradle.api.internal.artifacts.mvnsettings.DefaultMavenFileLocations;
import org.gradle.api.internal.artifacts.mvnsettings.DefaultMavenSettingsProvider;
import org.gradle.api.internal.artifacts.mvnsettings.LocalMavenRepositoryLocator;
import org.gradle.api.internal.artifacts.repositories.AbstractArtifactRepository;
import org.gradle.api.internal.artifacts.repositories.ResolutionAwareRepository;
import org.gradle.api.internal.artifacts.repositories.resolver.MavenResolver;
import org.gradle.api.internal.filestore.ivy.ArtifactIdentifierFileStore;
import org.gradle.cache.internal.DefaultCacheScopeMapping;
import org.gradle.internal.component.external.model.DefaultModuleComponentIdentifier;
import org.gradle.internal.component.external.model.ModuleComponentArtifactMetadata;
import org.gradle.internal.component.model.ComponentOverrideMetadata;
import org.gradle.internal.component.model.DefaultComponentOverrideMetadata;
import org.gradle.internal.component.model.DefaultIvyArtifactName;
import org.gradle.internal.component.model.IvyArtifactName;
import org.gradle.internal.resolve.result.BuildableModuleComponentMetaDataResolveResult;
import org.gradle.internal.resource.local.LocallyAvailableResourceFinder;
import org.gradle.internal.resource.local.PathKeyFileStore;
import org.gradle.internal.resource.local.ivy.LocallyAvailableResourceFinderFactory;
import org.gradle.internal.resource.transport.file.FileTransport;
import org.gradle.util.GradleVersion;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* Artifact repository resolving the dependencies against the system repository under /usr/share/maven-repo.
* Hook for Gradle's MavenResolver class.
*/
public class MavenDebianArtifactRepository extends AbstractArtifactRepository implements ResolutionAwareRepository {
public class MavenResolverHook {
private final Logger log = LoggerFactory.getLogger(MavenDebianArtifactRepository.class);
private final LocallyAvailableResourceFinder<ModuleComponentArtifactMetadata> locallyAvailableResourceFinder;
private final ArtifactIdentifierFileStore artifactFileStore;
private final GradlePomModuleDescriptorParser pomParser;
private static final MavenResolverHook INSTANCE = new MavenResolverHook();
/** The substitution rules for the Maven dependencies */
private DependencyRuleSetFiles rulesets;
/** The path to the local Maven repository */
private File repositoryPath = new File("/usr/share/maven-repo");
/** The placeholder used for ignored dependencies */
private static final ModuleComponentIdentifier IGNORED_DEPENDENCY_PLACEHOLDER = new DefaultModuleComponentIdentifier("org.debian.gradle", "gradle-dependency-placeholder", "1.0");
private static final Dependency IGNORED_DEPENDENCY_PLACEHOLDER = new Dependency("org.debian.gradle", "gradle-dependency-placeholder", "jar", "1.0", "compile", false, null, null);
public MavenDebianArtifactRepository() {
this.pomParser = new GradlePomModuleDescriptorParser(new DefaultVersionSelectorScheme(new DefaultVersionComparator()));
this.artifactFileStore = new ArtifactIdentifierFileStore(new PathKeyFileStore(repositoryPath), new DebianTemporaryFileProvider());
private MavenResolverHook() {
}
ArtifactCacheMetaData artifactCacheMetaData = new DefaultArtifactCacheMetaData(new DefaultCacheScopeMapping(new File(System.getProperty("user.home")),null, GradleVersion.current()));
LocalMavenRepositoryLocator localMavenRepositoryLocator = new DefaultLocalMavenRepositoryLocator(new DefaultMavenSettingsProvider(new DefaultMavenFileLocations()));
LocallyAvailableResourceFinderFactory locallyAvailableResourceFinderFactory = new LocallyAvailableResourceFinderFactory(artifactCacheMetaData, localMavenRepositoryLocator, artifactFileStore);
this.locallyAvailableResourceFinder = locallyAvailableResourceFinderFactory.create();
public static MavenResolverHook getInstance() {
return INSTANCE;
}
log.info("\tLoading the Maven rules...");
private void initRules() {
System.out.println("\tLoading the Maven rules...");
ArgumentsMap args = new ArgumentsMap(new ArgumentsIterable(new String[] { "--rules=debian/maven.rules", "--ignore-rules=debian/maven.ignoreRules"}));
rulesets = DependencyRuleSetFiles.fromCLIArguments(args, false);
rulesets.addDefaultRules();
}
@Override
public String getName() {
return "Debian Maven Repository";
public Map<String, String> rewrite(String groupId, String artifactId, String version, String type, String classifier) throws Exception {
if (rulesets == null) {
initRules();
}
public ConfiguredModuleComponentRepository createResolver() {
return new MavenResolver(getName(), repositoryPath.toURI(), new FileTransport("debian"), locallyAvailableResourceFinder, artifactFileStore, pomParser) {
@Override
protected void doResolveComponentMetaData(ModuleComponentIdentifier identifier, ComponentOverrideMetadata metadata, BuildableModuleComponentMetaDataResolveResult result) {
Dependency dependency = toDependency(identifier, metadata);
Dependency dependency = new Dependency(groupId, artifactId, type, version, "compile", false, classifier, null);
Dependency resolved = resolve(dependency);
if (resolved == null) {
log.info("\tIgnoring " + format(dependency));
identifier = IGNORED_DEPENDENCY_PLACEHOLDER;
System.out.println("\tIgnoring " + format(dependency));
resolved = IGNORED_DEPENDENCY_PLACEHOLDER;
} else if (dependency == resolved) {
log.info("\tPassing through " + format(dependency));
System.out.println("\tPassing through " + format(dependency));
} else {
log.info("\tReplacing " + format(dependency) + " -> " + format(resolved));
identifier = new DefaultModuleComponentIdentifier(resolved.getGroupId(), resolved.getArtifactId(), resolved.getVersion());
metadata = new DefaultComponentOverrideMetadata();
metadata.getArtifacts().add(new DefaultIvyArtifactName(resolved.getArtifactId(), resolved.getType(), resolved.getType(), resolved.getClassifier()));
System.out.println("\tReplacing " + format(dependency) + " -> " + format(resolved));
}
super.doResolveComponentMetaData(identifier, metadata, result);
}
};
Map<String, String> result = new HashMap<String, String>();
result.put("groupId", resolved.getGroupId());
result.put("artifactId", resolved.getArtifactId());
result.put("version", resolved.getVersion());
result.put("type", resolved.getType());
result.put("classifier", resolved.getClassifier());
return result;
}
/**
......@@ -152,21 +111,6 @@ public class MavenDebianArtifactRepository extends AbstractArtifactRepository im
return dependency;
}
/**
* Converts a Gradle dependency into a dependency object as handled by maven-repo-helper.
*/
private Dependency toDependency(ModuleComponentIdentifier identifier, ComponentOverrideMetadata metadata) {
String classifier = null;
String type = "jar";
if (!metadata.getArtifacts().isEmpty()) {
IvyArtifactName ivyArtifactName = metadata.getArtifacts().iterator().next();
classifier = ivyArtifactName.getClassifier();
type = ivyArtifactName.getType();
}
return new Dependency(identifier.getGroup(), identifier.getModule(), type, identifier.getVersion(), "compile", false, classifier, null);
}
/**
* Format a dependency for display (slightly more compact than dependency.toString())
*/
......
......@@ -15,11 +15,6 @@
</properties>
<dependencies>
<dependency>
<groupId>org.debian.maven</groupId>
<artifactId>maven-repo-helper</artifactId>
<version>1.8.10</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
......@@ -60,26 +55,6 @@
<scope>system</scope>
<systemPath>${gradle.libs}/gradle-tooling-api.jar</systemPath>
</dependency>
<dependency>
<groupId>org.gradle</groupId>
<artifactId>gradle-dependency-management</artifactId>
<version>${gradle.version}</version>
<scope>system</scope>
<systemPath>${gradle.plugins}/gradle-dependency-management.jar</systemPath>
</dependency>
<dependency>
<groupId>org.gradle</groupId>
<artifactId>gradle-resources</artifactId>
<version>${gradle.version}</version>
<scope>system</scope>
<systemPath>${gradle.libs}/gradle-resources.jar</systemPath>
</dependency>
<dependency>
<groupId>org.apache.ivy</groupId>
<artifactId>ivy</artifactId>
<version>2.4.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.gradle</groupId>
<artifactId>gradle-maven</artifactId>
......
......@@ -16,20 +16,21 @@
package org.debian.gradle;
import java.util.HashMap;
import java.util.Map;
import org.debian.gradle.tasks.MavenPom;
import org.gradle.api.Action;
import org.gradle.api.Plugin;
import org.gradle.api.Project;
import org.gradle.api.Task;
import org.gradle.api.artifacts.repositories.MavenArtifactRepository;
import org.gradle.api.invocation.Gradle;
import org.gradle.api.tasks.javadoc.Javadoc;
import org.gradle.external.javadoc.StandardJavadocDocletOptions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.HashMap;
import java.util.Map;
/**
* Gradle plugin installing the Debian repository before those defined in the build script.
*/
......@@ -37,38 +38,58 @@ public class DebianHelperPlugin implements Plugin<Gradle> {
private final Logger log = LoggerFactory.getLogger(DebianHelperPlugin.class);
private void configureJavadocLinks(Project project) {
if (project.getPluginManager().hasPlugin("java")) {
Javadoc javadocTask = ((Javadoc)(project.getTasksByName("javadoc", false).toArray()[0]));
if (javadocTask.getOptions() instanceof StandardJavadocDocletOptions) {
log.info("\tConfiguring javadoc links");
((StandardJavadocDocletOptions)(javadocTask.getOptions())).getLinks().add(0, "file:///usr/share/doc/default-jdk/api");
}
}
}
@Override
public void apply(Gradle gradle) {
// add the Debian repository to all projects
final MavenDebianArtifactRepository repository = new MavenDebianArtifactRepository();
gradle.allprojects(new Action<Project>() {
@Override
public void execute(final Project project) {
log.info("\tAdding Debian repository to project '" + project.getName() + "'");
Map<String, String> repositoryParams = new HashMap<>();
repositoryParams.put("name", "Debian Maven Repository");
repositoryParams.put("url", "file:/usr/share/maven-repo/");
MavenArtifactRepository repository = project.getRepositories().mavenCentral(repositoryParams);
project.getRepositories().remove(repository);
project.getRepositories().addFirst(repository);
project.getBuildscript().getRepositories().addFirst(repository);
}
});
// generate the Maven pom after building a project
gradle.allprojects(new Action<Project>() {
@Override
public void execute(final Project project) {
project.afterEvaluate(new Action<Project>() {
@Override
public void execute(Project project) {
if (project.getPluginManager().hasPlugin("java")) {
log.info("\tAdding task debianMavenPom to project '" + project.getName() + "'");
log.info("\tAdding Maven pom generation to project '" + project.getName() + "'");
project.getPluginManager().apply("maven");
Map<String, Class> debianMavenPomTaskOptions = new HashMap<String, Class>();
debianMavenPomTaskOptions.put("type", MavenPom.class);
project.task(debianMavenPomTaskOptions, "debianMavenPom");
((Task)(project.getTasksByName("jar", false).toArray()[0])).dependsOn("debianMavenPom");
((Task) project.getTasksByName("jar", false).toArray()[0]).dependsOn("debianMavenPom");
}
}
});
}
});
// link the javadoc with the system documentation
gradle.allprojects(new Action<Project>() {
@Override
public void execute(final Project project) {
project.afterEvaluate(new Action<Project>() {
@Override
public void execute(Project project) {
if (project.getPluginManager().hasPlugin("java")) {
Javadoc javadocTask = ((Javadoc) (project.getTasksByName("javadoc", false).toArray()[0]));
if (javadocTask.getOptions() instanceof StandardJavadocDocletOptions) {
log.info("\tLinking the generated javadoc to the system JDK API documentation");
((StandardJavadocDocletOptions) javadocTask.getOptions()).getLinks().add(0, "file:///usr/share/doc/default-jdk/api");
}
}
configureJavadocLinks(project);
}
});
}
......@@ -81,3 +102,4 @@ public class DebianHelperPlugin implements Plugin<Gradle> {
gradle.addBuildListener(new ProjectNameInitializer());
}
}
......@@ -61,6 +61,9 @@ sub build {
push(@_, "jar");
}
# Add the hook to the classpath
$ENV{JAVA_OPTS} .= " -Xbootclasspath/a:/usr/share/java/gradle-helper-hook.jar:/usr/share/java/maven-repo-helper.jar";
$this->doit_in_builddir(@{$this->{gradle_cmd}}, @_);
}
......
......@@ -10,6 +10,7 @@
<description>Helper tools for building Debian packages with Gradle</description>
<modules>
<module>gradle-helper-hook</module>
<module>gradle-helper-plugin</module>
<module>gradle-dependency-placeholder</module>
</modules>
......