【问题标题】:How to generate/create dependencies in pom.xml from a lib folder including jar files如何从包含 jar 文件的 lib 文件夹在 pom.xml 中生成/创建依赖项
【发布时间】:2019-06-19 15:38:46
【问题描述】:

假设我有一个文件夹,其中包含 maven 项目中所需的所有 jar 文件。

我想从文件夹中的 jar 文件自动填充/写入 pom.xml 部分中的依赖项。是否有现有的自动化方法可以做到这一点?

如果文件夹中有 log4j-core-2.11.1.jar 文件,我想得到:

<dependency>
    <groupId>org.apache.logging.log4j</groupId>
    <artifactId>log4j-core</artifactId>
    <version>2.11.1</version>
</dependency>

谢谢

【问题讨论】:

  • 这些 jar 文件是 maven 构建的结果吗? Maven 将 pom.xml 存储在 META-INF 中的 jar 中。您可以从每个 jar 中提取它并获取您需要的所有信息。
  • 您很清楚 Maven 不会针对您的 lib 文件夹解析这些 jar?您仍然需要一个 Maven 存储库。
  • @Jens : jar 文件和项目来自遗留代码。
  • @JF : 依赖将更新 mvn repo
  • @toki-lou-tok 您应该使用我回答中的代码检查您的 log4j-core-2.11.1.jar。具有此名称的 jar 文件很可能是 log4j 项目的 maven 构建的结果。

标签: maven dependencies pom.xml


【解决方案1】:

@Jens :谢谢,你的代码绝对有帮助(不能投票给你;低代表)

因为我想要一种快速(至少对我而言)的方式,我最终得到了一些 python 行: 他们在这里(以防万一他们可以提供帮助)

import sys
import json
from urllib.request import urlopen
import hashlib
from string import Template
from collections import namedtuple
from os import listdir

path = 'your path to jar folder'
files = listdir(path)


def hashfile(filepath):
    f = open(filepath, 'rb')
    readFile = f.read()
    sha1Hash = hashlib.sha1(readFile)
    sha1Hashed = sha1Hash.hexdigest()
    return sha1Hashed

def request( hash ):
    url = 'https://search.maven.org/solrsearch/select?q=1:' + \
        hash+'&wt=json&rows=1'
    response = urlopen(url).read()
    return json.loads(response.decode('utf-8'));

dep = '''
<dependency>
    <groupId> $g </groupId>
    <artifactId> $a </artifactId>
    <version> $v </version>
</dependency>
'''

deps= '''
<dependencies>
    $d
</dependencies>
'''

deb_tpl = Template(dep)
debs_tpl = Template(deps)
Jar = namedtuple('Jar',[ 'g', 'a', 'v'])

dependencies = [None]*len(files)
for i, filename in enumerate(files):
    sha1=hashfile( "%s/%s" %(path, filename))
    print("File : %i : sha1 : %s" % (i, sha1))
    obj = request( str(sha1 ))
    if obj['response']['numFound'] == 1:
        jar = Jar(obj['response']['docs'][0]['g'],
                 obj['response']['docs'][0]['a'],
                 obj['response']['docs'][0]['v'])
        dependencies[i] = jar

#         print(obj['response']['docs'][0]['a'])
#         print(obj['response']['docs'][0]['g'])
#         print(obj['response']['docs'][0]['v'])

    else :
        print('Cannot find %s' % filename)
        dependencies[i] = None
deps_all = '\r\n'.join([ deb_tpl.substitute(f._asdict())for f in dependencies if f is not None ])
debs_tpl.substitute(d=deps_all)
print(res)

Final res 为我提供了在 search.maven 上找到的所有依赖项。 对于缺少的罐子,您可以使用this answer

【讨论】:

    【解决方案2】:

    假设 jar 文件是 maven 构建的结果,您可以从以下代码开始:

    import java.io.FileInputStream;
    import java.io.IOException;
    import java.util.Scanner;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    
    public class CheckMe {
    
      public static void main(String args[]) throws IOException {
    
        String fileZip =
            "yourjar.jar";
        ZipInputStream zis = new ZipInputStream(new FileInputStream(fileZip));
        ZipEntry zipEntry = zis.getNextEntry();
        while (zipEntry != null) {
          if (zipEntry.getName().endsWith("pom.xml")) {
            final StringBuilder pom = new StringBuilder();
            final byte[] buffer = new byte[1024];
    
            while (zis.read(buffer, 0, buffer.length) != -1) {
              pom.append(new String(buffer));
            }
    
            System.out.println("<dependency>");
            Scanner scanner = new Scanner(pom.toString());
            boolean groupDone = false, artifactDone = false, versionDone = false;
            while (scanner.hasNextLine()) {
              String line = scanner.nextLine();
              if (line.contains("groupId") && !groupDone) {
                System.out.println(line);
                groupDone = true;
              }
              if (line.contains("artifactId") && !artifactDone) {
                System.out.println(line);
                artifactDone = true;
              }
              if (line.contains("version") && !versionDone) {
                System.out.println(line);
                versionDone = true;
              }
            }
            scanner.close();
            System.out.println("</dependency>");
          }
          zipEntry = zis.getNextEntry();
        }
        zis.closeEntry();
        zis.close();
      }
    }
    
    

    这是一个快速的 hack,您必须添加目录扫描程序才能获取所有 jar 文件名,但它应该可以解决问题。

    【讨论】:

      【解决方案3】:

      我运行了 python 脚本,但它没有完全充实嵌套文件夹等。我在How to know groupid and artifactid of any external jars in maven android project找到了一个很好的替代脚本

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-04-25
        • 1970-01-01
        • 2021-09-15
        • 1970-01-01
        • 2013-07-13
        • 2011-01-16
        • 2013-06-30
        相关资源
        最近更新 更多