草庐IT

java - 在 Maven 尝试解析它之前,将本地 jar 依赖项作为生命周期的一部分安装

coder 2023-08-28 原文

由于两个依赖项之间存在一些不兼容性,我被迫为我的一个依赖项制作一个阴影版本。这意味着我的项目现在依赖于本地 .jar 文件。

在运行 mvn install 之前,我以前完全可以使用 mvn install-file 将这个 .jar 安装到我的本地存储库:

mvn org.apache.maven.plugins:maven-install-plugin:2.5.2:install-file -Dfile=lib/my-custom-jar-1.0.0.jar
mvn install

但是,我的项目现在将在自动构建服务器上,该服务器只会执行 mvn clean install 而不会执行其他操作。

找了半天,找到了几种方案,但都不是完美的。

我将在下面写下我找到的解决方案作为答案,但我发布这个问题是希望有人有更好的主意来解决这个问题。

最佳答案

这是我尝试过的一些解决方案,但对我的使用来说不是很好:

1。 maven 安装插件

想法是将安装文件目标添加为安装生命周期的一部分,方法是将其添加到 pom 中:

<plugin>
  <artifactId>maven-install-plugin</artifactId>
  <version>2.5.2</version>
  <executions>
    <execution>
      <phase>validate</phase>
      <goals>
        <goal>install-file</goal>
      </goals>
      <configuration>
        <file>lib/my-custom-jar-1.0.0.jar</file>
      </configuration>
    </execution>
  </executions>
</plugin>

[...]

<dependency>
  <groupId>org.me</groupId>
  <artifactId>my-custom-jar</artifactId>
  <version>1.0.0</version>
</dependency>

但是,即使是第一个目标,validate,Maven 也会尝试在运行 install-file 之前解决依赖关系。

我看到了使用 clean 目标的想法。烦人的是,当你执行单独的命令时(mvn clean && mvn install),这会起作用,但如果你在一个 mvn 命令(mvn clean install)中同时执行这两个命令,Maven 将首先解决依赖关系.有解决办法吗?

2。多模块项目

想法,seen in this Stack Overflow answer , 是你在你的父 pom 中安装文件,并在你的子 pom 中添加依赖项。 Maven 只会单独解决依赖关系,所以这应该有效。

但是我的项目是一个单一的模块,为了解决这个问题而制作一个假父项似乎是一个过于复杂和丑陋的 hack。

3。具有 basedir 的系统范围

<dependency>
  <groupId>org.me</groupId>
  <artifactId>my-custom-jar</artifactId>
  <version>1.0.0</version>
  <scope>system</scope>
  <systemPath>${basedir}/lib/my-custom-jar-1.0.0.jar</systemPath>
</dependency>

虽然这看起来像是专门为这种情况而制作的,但系统范围实际上期望依赖关系存在于您将运行项目的每个系统上,因此它不会打包在 .war 中,使得我的项目无法运行。

4。 addjars-maven-插件

This custom plugin found here在您的 .war 文件中包含一个 .jar,然后在编译期间将其添加到您的 pom。

<plugin>
  <groupId>com.googlecode.addjars-maven-plugin</groupId>
  <artifactId>addjars-maven-plugin</artifactId>
  <version>1.0.5</version>
  <executions>
    <execution>
      <goals>
        <goal>add-jars</goal>
      </goals>
      <configuration>
        <resources>
          <resource>
            <directory>${basedir}/lib</directory>
            <includes>
              <include>**/my-custom-jar-1.0.0.jar</include>
            </includes>
          </resource>
        </resources>
      </configuration>
    </execution>
  </executions>
</plugin>

这在大多数正常情况下都有效。但是,由于您没有在实际 pom 中指示对自定义 .jar 的任何依赖性,因此您的 IDE 将缺少很多类,因此您需要手动将自定义 .jar 添加为外部库。

这仍然有些 hacky,不适用于某些特殊情况(例如,用于 Jenkins 调试的 hpi:run 会抛出一些错误)。另外,我希望我的代码不依赖第三方插件。

5.目录内 Maven 存储库

我在创建这篇文章后找到了这个解决方案,对此我非常满意。

这与在我的问题中执行 mvn install-file 命令的结果几乎相同,除了您保存结果并将其作为项目的一部分通过在存储库中安装自定义库位于您的项目中。

您需要使用此命令预安装库。

mvn org.apache.maven.plugins:maven-install-plugin:2.5.1:install-file \
-Dfile=lib/cloudfoundry-client-lib-shaded-1.0.3.jar \
-DlocalRepositoryPath=lib

完成后,您的存储库将在 lib 文件夹中创建,您将不再需要执行此命令。

表明你想在你的pom中使用这个仓库:

<repository>
  <id>Local repository</id>
  <url>file://${basedir}/lib</url>
</repository>

[...]

<dependency>
  <groupId>org.me</groupId>
  <artifactId>my-custom-jar</artifactId>
  <version>1.0.0</version>
</dependency>

此解决方案迫使您向 SCM 提交一堆额外的文件夹,但这对我来说是一个可以控制的缺点,我对此很满意。

关于java - 在 Maven 尝试解析它之前,将本地 jar 依赖项作为生命周期的一部分安装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26618192/

有关java - 在 Maven 尝试解析它之前,将本地 jar 依赖项作为生命周期的一部分安装的更多相关文章

  1. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  2. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

  3. ruby-on-rails - 在 ruby​​ .gemspec 文件中,如何指定依赖项的多个版本? - 2

    我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这

  4. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  5. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  6. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

  7. ruby - 字符串文字中的转义状态作为 `String#tr` 的参数 - 2

    对于作为String#tr参数的单引号字符串文字中反斜杠的转义状态,我觉得有些神秘。你能解释一下下面三个例子之间的对比吗?我特别不明白第二个。为了避免复杂化,我在这里使用了'd',在双引号中转义时不会改变含义("\d"="d")。'\\'.tr('\\','x')#=>"x"'\\'.tr('\\d','x')#=>"\\"'\\'.tr('\\\d','x')#=>"x" 最佳答案 在tr中转义tr的第一个参数非常类似于正则表达式中的括号字符分组。您可以在表达式的开头使用^来否定匹配(替换任何不匹配的内容)并使用例如a-f来匹配一

  8. java - 我的模型类或其他类中应该有逻辑吗 - 2

    我只想对我一直在思考的这个问题有其他意见,例如我有classuser_controller和classuserclassUserattr_accessor:name,:usernameendclassUserController//dosomethingaboutanythingaboutusersend问题是我的User类中是否应该有逻辑user=User.newuser.do_something(user1)oritshouldbeuser_controller=UserController.newuser_controller.do_something(user1,user2)我

  9. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  10. Observability:从零开始创建 Java 微服务并监控它 (二) - 2

    这篇文章是继上一篇文章“Observability:从零开始创建Java微服务并监控它(一)”的续篇。在上一篇文章中,我们讲述了如何创建一个Javaweb应用,并使用Filebeat来收集应用所生成的日志。在今天的文章中,我来详述如何收集应用的指标,使用APM来监控应用并监督web服务的在线情况。源码可以在地址 https://github.com/liu-xiao-guo/java_observability 进行下载。摄入指标指标被视为可以随时更改的时间点值。当前请求的数量可以改变任何毫秒。你可能有1000个请求的峰值,然后一切都回到一个请求。这也意味着这些指标可能不准确,你还想提取最小/

随机推荐