├── README ├── remove-extra-dependency-management.rb └── remove-extra-dependencies.rb /README: -------------------------------------------------------------------------------- 1 | Scripts for removing extra dependencies and dependency managements from (large) Maven projects. 2 | 3 | To remove all dependencies that are not direcly needed from Maven project /my_project/pom.xml and all it's sub modules run: 4 | 5 | ./remove-extra-dependencies.rb /my_project/pom.xml 'mvn clean install -N' 6 | 7 | The command 'mvn clean install -N' will be used to determine if it was OK to remove a dependency or not. 8 | 9 | To remove the dependency management entries that are not needed in project /my_project/pom.xml run: 10 | 11 | ./remove-extra-dependency_management.rb /my_project/pom.xml 12 | 13 | More on this: http://samulisiivonen.blogspot.com/2012/01/cleanin-up-maven-dependencies.html 14 | -------------------------------------------------------------------------------- /remove-extra-dependency-management.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require 'rexml/document' 3 | 4 | if ARGV.size < 1 5 | puts("Usage: #{$0} ") 6 | exit 1 7 | end 8 | puts "This script will remove extra dependency management dependencies from #{ARGV[0]}" 9 | 10 | def get_dependency_managements(pom) 11 | deps = Array.new 12 | REXML::Document.new(File.new(pom)).elements.each("project/dependencyManagement/dependencies/dependency") do | dep | 13 | deps = deps << dep.to_s 14 | end 15 | deps 16 | end 17 | 18 | def get_content(dep, pom, tag) 19 | return "" if not dep.to_s.include?("<#{tag}>") 20 | doc = REXML::Document.new(File.new(pom)) 21 | value = "" 22 | value = doc.elements["project/parent/#{tag}"].text if doc.elements["project/parent/#{tag}"] 23 | value = doc.elements["project/#{tag}"].text if doc.elements["project/#{tag}"] 24 | dep.to_s.sub(/<\/#{tag}>.*/m, "").sub(/.*<#{tag}>/m, "").sub("${project.#{tag}}", value).sub("${pom.#{tag}}", value) 25 | end 26 | 27 | def unify_dependency(dep, pom) 28 | dep = get_content(dep, pom, "groupId") + ":" + get_content(dep, pom, "artifactId") + ":" + get_content(dep, pom, "type") + ":" + get_content(dep, pom, "classifier") 29 | end 30 | 31 | def get_dependencies(pom) 32 | deps = Array.new 33 | REXML::Document.new(File.new(pom)).elements.each("project/dependencies/dependency") do | dep | 34 | deps = deps << unify_dependency(dep, pom) 35 | end 36 | deps 37 | end 38 | 39 | def get_all_dependencies(pom) 40 | deps = get_dependencies(pom) 41 | doc = REXML::Document.new(File.new(pom)) 42 | REXML::XPath.match(doc, "//module").each do | mod | 43 | deps = deps | get_all_dependencies(File.dirname(pom) + "/" + mod.text + "/pom.xml") 44 | end 45 | deps 46 | end 47 | 48 | def remove_dependency(pom, dep) 49 | puts "Removing #{unify_dependency(dep, pom)}" 50 | content = IO.read(pom) 51 | tmp = rand().to_s 52 | File.open(pom, 'w') do |f| 53 | f.write(content.sub(dep.to_s, tmp).sub(/\n\s*#{tmp}/, "")) 54 | end 55 | end 56 | 57 | deps = get_all_dependencies(ARGV[0]) 58 | get_dependency_managements(ARGV[0]).each do | dep | 59 | remove_dependency(ARGV[0], dep) if not deps.include?(unify_dependency(dep, ARGV[0])) 60 | end 61 | 62 | -------------------------------------------------------------------------------- /remove-extra-dependencies.rb: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env ruby 2 | require 'rexml/document' 3 | 4 | if ARGV.size != 2 then 5 | puts("Usage: #{$0} /path/to/root/pom.xml 'mvn command to use'") 6 | exit 1 7 | end 8 | puts "This script will remove extra Maven dependencies of #{ARGV[0]} and all it's sub modules." 9 | puts "Dependencies are removed one by one and if the command '#{ARGV[1]}' is successful the dependency is left out." 10 | 11 | def get_dependencies(pom) 12 | array = Array.new 13 | REXML::Document.new(File.new(pom)).elements.each("project/dependencies/dependency") do | dependency | 14 | array << dependency.to_s 15 | end 16 | array 17 | end 18 | 19 | def get_poms_and_dependencies(pom, result) 20 | dir = File.dirname(pom) 21 | result[pom] = get_dependencies(pom) 22 | doc = REXML::Document.new(File.new(pom)) 23 | REXML::XPath.match(doc, "//module").each do | mod | 24 | get_poms_and_dependencies(dir + "/" +mod.text + "/pom.xml", result) 25 | end 26 | end 27 | 28 | def replace(file, string, with) 29 | content = IO.read(file); 30 | File.open(file, 'w') { |f| f.write(content.gsub(string, with)) } 31 | end 32 | 33 | def remove_dependency_if_possible(pom, dependency) 34 | place_holder = "" 35 | replace(pom, dependency, place_holder) 36 | if system("cd #{File.dirname(pom)} && #{ARGV[1]} > /dev/null 2> /dev/null") 37 | puts "SUCCESS" 38 | replace(pom, /\n^\s*#{place_holder}\s*$/m, "") 39 | else 40 | puts "FAILED" 41 | replace(pom, place_holder, dependency) 42 | end 43 | end 44 | 45 | poms_and_dependencies = Hash.new 46 | get_poms_and_dependencies(ARGV[0], poms_and_dependencies) 47 | all_dependencies = Array.new 48 | poms_and_dependencies.each { |pom,dependencies| all_dependencies = all_dependencies + dependencies } 49 | puts "Total number of pom.xml files #{poms_and_dependencies.size}, total number of dependencies #{all_dependencies.size}" 50 | 51 | counter = 1 52 | poms_and_dependencies.each do |pom, dependencies| 53 | puts "Handling #{dependencies.size} dependencies of #{pom}" 54 | dependencies.each do | dependency | 55 | group = dependency.match(/.*(.*)<\/groupId>.*/)[1].strip 56 | artifact = dependency.match(/.*(.*)<\/artifactId>.*/)[1].strip 57 | print "Attempt #{counter}/#{all_dependencies.size}: remove #{group}:#{artifact}..." 58 | remove_dependency_if_possible(pom, dependency) 59 | counter = counter + 1 60 | end 61 | end 62 | 63 | --------------------------------------------------------------------------------