Skip to content

Commit

Permalink
Use configurations where canBeResolved = true. Improve logging. Fix l…
Browse files Browse the repository at this point in the history
…ocked file issue for caching of test task
  • Loading branch information
uklance committed Feb 24, 2019
1 parent c57ea1a commit 036344f
Show file tree
Hide file tree
Showing 2 changed files with 86 additions and 79 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,101 +18,107 @@ import org.apache.maven.model.building.ModelBuildingRequest
import org.apache.maven.model.resolution.ModelResolver

class MavenDependencyExport extends DefaultTask {
private Collection<Configuration> configurations = new LinkedHashSet<>()

public Collection<Configuration> configurations = new LinkedHashSet<>()
public Map<String, Object> systemProperties = System.getProperties()

@InputFiles
FileCollection getInputFiles() {
return project.files(prepareConfigurations())
}
@InputFiles
FileCollection getInputFiles() {
return project.files(prepareConfigurations())
}

@OutputDirectory
File exportDir = new File(project.buildDir, 'maven-dependency-export')
@OutputDirectory
File exportDir = new File(project.buildDir, 'maven-dependency-export')

protected Collection<Configuration> prepareConfigurations() {
if (!configurations.empty) {
return configurations
}
Collection<Configuration> defaultConfigurations = new LinkedHashSet<>()
defaultConfigurations.addAll(project.buildscript.configurations)
defaultConfigurations.addAll(project.configurations)
return defaultConfigurations
}
protected Collection<Configuration> prepareConfigurations() {
if (!configurations.empty) {
return configurations
}
Collection<Configuration> defaultConfigurations = new LinkedHashSet<>()
defaultConfigurations.addAll(project.buildscript.configurations.findAll { it.canBeResolved })
defaultConfigurations.addAll(project.configurations.findAll { it.canBeResolved })
return defaultConfigurations
}

void configuration(String name) {
configurations.add(project.configurations.getByName(name))
}
void configuration(String name) {
configurations.add(project.configurations.getByName(name))
}

void configuration(Configuration configuration) {
configurations.add(configuration)
}
void configuration(Configuration configuration) {
configurations.add(configuration)
}

@TaskAction
void build() {
@TaskAction
void build() {
ModelResolveListener resolveListener = { String groupId, String artifactId, String version, File pomFile ->
copyAssociatedPom(groupId, artifactId, version, pomFile)
}
ModelResolver modelResolver = new ModelResolverImpl(name, project, resolveListener)
for (Configuration config : prepareConfigurations()) {
copyJars(config)
copyPoms(config, modelResolver)
}
}
for (Configuration config : prepareConfigurations()) {
logger.info "Exporting ${config.name}..."
copyJars(config)
copyPoms(config, modelResolver)
}
Set<File> sortedFiles = new TreeSet()
sortedFiles.addAll(project.fileTree(exportDir).files)
logger.info("Exported ${sortedFiles.size()} files")
sortedFiles.each {
logger.info(" $it")
}
}

protected void copyJars(Configuration config) {
for (ResolvedArtifact artifact : config.resolvedConfiguration.resolvedArtifacts) {
ModuleVersionIdentifier moduleVersionId = artifact.moduleVersion.id
File moduleDir = new File(exportDir, getPath(moduleVersionId.group, moduleVersionId.name, moduleVersionId.version))
project.mkdir(moduleDir)
project.copy {
from artifact.file
into moduleDir
}
}
}
protected void copyJars(Configuration config) {
for (ResolvedArtifact artifact : config.resolvedConfiguration.resolvedArtifacts) {
ModuleVersionIdentifier moduleVersionId = artifact.moduleVersion.id
File moduleDir = new File(exportDir, getPath(moduleVersionId.group, moduleVersionId.name, moduleVersionId.version))
project.mkdir(moduleDir)
project.copy {
from artifact.file
into moduleDir
}
}
}

protected void copyPoms(Configuration config, ModelResolver modelResolver) {
List<ComponentIdentifier> componentIds = config.incoming.resolutionResult.allDependencies.collect { it.selected.id }
protected void copyPoms(Configuration config, ModelResolver modelResolver) {
List<ComponentIdentifier> componentIds = config.incoming.resolutionResult.allDependencies.collect { it.selected.id }

ArtifactResolutionResult result = project.dependencies.createArtifactResolutionQuery()
.forComponents(componentIds)
.withArtifacts(MavenModule, MavenPomArtifact)
.execute()
ArtifactResolutionResult result = project.dependencies.createArtifactResolutionQuery()
.forComponents(componentIds)
.withArtifacts(MavenModule, MavenPomArtifact)
.execute()

DefaultModelBuilderFactory factory = new DefaultModelBuilderFactory()
DefaultModelBuilder builder = factory.newInstance()

for (component in result.resolvedComponents) {
ComponentIdentifier componentId = component.id
for (component in result.resolvedComponents) {
ComponentIdentifier componentId = component.id

if (componentId instanceof ModuleComponentIdentifier) {
File moduleDir = new File(exportDir, getPath(componentId.group, componentId.module, componentId.version))
project.mkdir(moduleDir)
component.getArtifacts(MavenPomArtifact).each { ArtifactResult artifactResult ->
File pomFile = artifactResult.file
project.copy {
from pomFile
into moduleDir
}
if (componentId instanceof ModuleComponentIdentifier) {
File moduleDir = new File(exportDir, getPath(componentId.group, componentId.module, componentId.version))
project.mkdir(moduleDir)
component.getArtifacts(MavenPomArtifact).each { ArtifactResult artifactResult ->
File pomFile = artifactResult.file
project.copy {
from pomFile
into moduleDir
}

// force the parent POMs and BOMs to be downloaded and copied
try {
ModelBuildingRequest req = new DefaultModelBuildingRequest()
req.setModelResolver(modelResolver)
req.setPomFile(pomFile)
req.getSystemProperties().putAll(systemProperties)
req.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL)
try {
ModelBuildingRequest req = new DefaultModelBuildingRequest()
req.setModelResolver(modelResolver)
req.setPomFile(pomFile)
req.getSystemProperties().putAll(systemProperties)
req.setValidationLevel(ModelBuildingRequest.VALIDATION_LEVEL_MINIMAL)

// execute the model building request
builder.build(req).getEffectiveModel()
} catch (Exception e) {
e.printStackTrace(System.out)
}
}
}
}
}
builder.build(req).getEffectiveModel()
} catch (Exception e) {
logger.error("Error resolving $pomFile", e)
}
}
}
}
}

protected void copyAssociatedPom(String groupId, String artifactId, String version, File pomFile) {
File moduleDir = new File(exportDir, getPath(groupId, artifactId, version))
Expand All @@ -123,7 +129,7 @@ class MavenDependencyExport extends DefaultTask {
}
}

protected String getPath(String group, String module, String version) {
return "${group.replace('.','/')}/${module}/${version}"
}
protected String getPath(String group, String module, String version) {
return "${group.replace('.','/')}/${module}/${version}"
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import spock.lang.Specification

class MavenDependencyExportTest extends Specification {

@Rule final TemporaryFolder testProjectDir = new TemporaryFolder()
@Rule final TemporaryFolder tempFolder = new TemporaryFolder()

def setup() {
URL testkitPropsUrl = getResourceUrl("testkit-gradle.properties")
Expand All @@ -29,13 +29,14 @@ class MavenDependencyExportTest extends Specification {
}

void writeFile(String path, String text) {
File file = new File(testProjectDir.root, path)
File file = new File(tempFolder.root, path)
file.parentFile.mkdirs()
file.text = text
}

def "Test dependency export"() {
given:
File testkitDir = tempFolder.newFolder('testkit')
writeFile("build.gradle", '''
plugins {
id 'com.lazan.dependency-export'
Expand All @@ -49,7 +50,6 @@ class MavenDependencyExportTest extends Specification {
}
mavenDependencyExport {
configuration 'compile'
exportDir = file("$buildDir/offline-repo")
}
task verifyExport {
Expand All @@ -71,7 +71,8 @@ class MavenDependencyExportTest extends Specification {
''')
when:
def result = GradleRunner.create()
.withProjectDir(testProjectDir.root)
.withProjectDir(tempFolder.root)
.withTestKitDir(testkitDir)
.withArguments('verifyExport', '--stacktrace')
.withPluginClasspath()
.build()
Expand Down

2 comments on commit 036344f

@stefanleh
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks like we should introduce a proper code style.
The indentations are all messed up.
Which IDE you are use?

@uklance
Copy link
Owner Author

@uklance uklance commented on 036344f Feb 24, 2019 via email

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.