V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
tgich
V2EX  ›  程序员

Maven 能否实现这样的功能?

  •  
  •   tgich · 2023-08-21 15:05:48 +08:00 · 1516 次点击
    这是一个创建于 467 天前的主题,其中的信息可能已经有所发展或是发生改变。

    能否在庞大的本地库中复制出一个工程所引用的包含全路径和 jar 和 pom.xml 的目录?

    9 条回复    2023-08-22 15:27:58 +08:00
    jorneyr
        1
    jorneyr  
       2023-08-21 15:46:11 +08:00   ❤️ 1
    Gradle 倒是挺好做这件事的,在 build 的函数里输出 jar 路径就好,Maven 的插件应该也行,只是开发 Maven 插件比较麻烦一些。
    zzq825924
        2
    zzq825924  
       2023-08-21 15:48:31 +08:00   ❤️ 1
    Maven 通常不会在本地仓库中复制整个工程所引用的包含全路径、JAR 文件和 pom.xml 的目录。Maven 本地仓库的设计是为了管理和存储构建产物(例如 JAR 文件)以及与它们相关的元数据(例如 POM 文件),而不是为了存储源代码目录结构或完整的工程目录。

    Maven 通过坐标( Coordinate )来标识依赖关系,坐标通常包括组织( Group ID )、项目( Artifact ID )、版本号( Version )等信息。当你在项目的 pom.xml 文件中声明依赖关系时,Maven 使用这些坐标来检索依赖项并存储它们在本地仓库中。这意味着你只会在本地仓库中看到 JAR 文件和相关的 POM 文件,而不会看到原始代码目录结构。

    如果你需要访问依赖项的源代码,通常的做法是使用工具如 Git 或 SVN 直接克隆或检出依赖项的源代码存储库,而不是从本地仓库中获取源代码。

    然而,如果你真的需要将依赖项的源代码复制到本地目录中,你可以手动下载依赖项的源代码并将其解压到一个指定的目录中,但这不是 Maven 的标准用法,也不太推荐,因为它破坏了依赖管理的一致性和可维护性。此外,这种方式可能需要大量的手动工作,特别是对于复杂的项目和依赖项。

    综上所述,通常情况下,Maven 不会为你复制工程所引用的完整目录结构,而是专注于管理和提供依赖项的二进制构建和相关元数据。如有必要,你可以手动处理源代码的复制和管理。








    =======================




    Maven 不提供直接将依赖项的源代码复制到指定目录的命令。但你可以使用 Maven 插件或脚本来实现这一目标。下面是一种可能的方法:

    1. **使用 Maven 插件**:你可以使用 Maven 的`dependency:copy-dependencies`插件将依赖项的 JAR 文件复制到指定目录。但这仅限于 JAR 文件,不包括源代码。

    ```shell
    mvn dependency:copy-dependencies -DoutputDirectory=your_output_directory
    ```

    要获取依赖项的源代码,你可以使用`dependency:sources`插件:

    ```shell
    mvn dependency:sources -DoutputDirectory=your_output_directory
    ```

    2. **编写脚本**:你也可以编写一个自定义脚本来完成这个任务。例如,你可以使用 shell 脚本或批处理脚本(取决于你使用的操作系统)来遍历项目的依赖关系,并将它们的源代码复制到指定目录。这需要一些编程和脚本技巧,但可以实现你想要的功能。

    请注意,这两种方法都需要手动处理,并且在某些情况下可能会变得复杂,特别是对于具有大量依赖项的项目。要注意维护这样的自定义脚本,以确保它们与项目的依赖关系保持同步。

    总之,虽然可以通过插件或自定义脚本实现将依赖项的源代码复制到指定目录,但这不是 Maven 的标准用法,需要谨慎使用,以避免潜在的维护问题。最好的做法是根据需要查看和编辑依赖项的源代码,并使用版本控制系统(如 Git )来管理和维护源代码。
    Grande
        3
    Grande  
       2023-08-21 16:46:50 +08:00   ❤️ 1
    盲猜在反编译工程🙊
    tgich
        4
    tgich  
    OP
       2023-08-21 16:51:07 +08:00
    @Grande 非也,就是给同事传 maven 包,但是我的工程必需的包全在本地大库里太多了我挑不出这个工程最小包
    ns09005264
        5
    ns09005264  
       2023-08-21 20:21:53 +08:00   ❤️ 1
    用 mvn 列出所有的依赖(大概是这个 mvn dependency:list),将结果输出到文件里记录下来,用 vim 编辑文件,通过一顿替换,将输出结果改造成 cp -r com/xxx/version xxx 之类的命令,然后执行。
    或者将你的本地仓库部署为私有的远程仓库 remote repository ,同事在自己的 mvn 配置文件里添加你的仓库,通过项目 pom 文件下载出来。
    以上是我臆想出来的思路,我已经很久没用过 maven 了
    CC11001100
        6
    CC11001100  
       2023-08-22 10:22:42 +08:00   ❤️ 1
    通过这个命令把当前项目依赖的 jar 包拷贝到给定的目录:
    `mvn dependency:copy-dependencies -DoutputDirectory=/directory/for/output/`
    打包发送给同事,他接收后解压加到项目的依赖中,然后使用这个工具挑拣出中央仓库有的和仅在本地有的,生成自己的 pom.xml 文件:
    [https://github.com/java-sec/jar-finder]( https://github.com/java-sec/jar-finder)
    最后把项目跑起来。。。当时写这个工具的场景跟 op 有点类似,是在逆别人发布的项目的依赖...
    CC11001100
        7
    CC11001100  
       2023-08-22 10:24:44 +08:00
    @CC11001100 补充一下,当时是一个开源项目,但是没有对外开放扩展 API ,为了扩展功能就自己想法子搞 API ,好像是 jadx 。。。不是破解商业项目。。。
    tgich
        8
    tgich  
    OP
       2023-08-22 10:57:07 +08:00
    最后解决了,利用 maven 默认路径是 C 盘的.m2 文件夹,执行 mvn dependency:copy-dependencies -DoutputDirectory=your_output_directory ,会自动下载到.m2 ,前提是要把.m2 提前清空就能获得最小包了
    dif
        9
    dif  
       2023-08-22 15:27:58 +08:00
    我会经常清理.m2 文件,曾经也是累积到 15 个 G 了。除了公司自己的包,其他的都可以通过网上下载,再说了,离职以后前公司的包也基本上用不上了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2600 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 39ms · UTC 06:33 · PVG 14:33 · LAX 22:33 · JFK 01:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.