- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想构建两个不同版本的自定义 SonarQube (SQ) 插件;一个用于 SonarQube 6.7.x LTS 版本,一个用于最新的 7.6 版本。目前,我有一个类似于以下的 Maven 结构:
plugin-6.7 和 7.6 的大部分源代码和资源都是相同的;只有少数类是不同的。因此,我想将此公共(public)代码移动到某个共享源文件夹/模块。
尽管如此,我仍然想将这个公共(public)代码编译两次,以验证代码是否针对两个 SQ API 版本编译。在 Eclipse 中,这应该显示为两个单独的源文件夹或项目,因此我可以轻松验证通用代码没有使用 6.7 API 中尚不可用的任何 SQ API,也没有使用任何已删除的 API或在 7.6 API 中弃用。
我最好坚持在一个版本中构建两个插件版本,所以如果可能的话,我想避免使用两个单独的配置文件。
这有可能吗?
通过 Maven,我找到了几种方法来实现它,但我无法使用这些方法中的任何一种来使用 m2eclipse。
方法一
新建模块plugin-common,包含pom-6.7.xml和pom-7.6.xml。除了 Artifact ID 或分类器以及对不同 SQ API 版本的依赖性之外,这两个 pom 本质上是相同的。父项目使用
将它们定义为 2 个独立的模块<module>plugin-common/pom-6.7.xml</module>
<module>plugin-common/pom-7.6.xml</module>
这种方法的问题是我无法将这些模块导入到 Eclipse 中,因为 m2eclipse 只支持 pom.xml 作为文件名。
方法二
与上述类似,但对 pom.xml 文件使用单独的子目录并使用 <sourceDirectory>${project.basedir}/../src/main/java</sourceDirectory>
指向公共(public)源代码:
这种方法允许将两个插件通用版本导入到 Eclipse 中,但 Eclipse 会提示“在项目基目录之外访问 .../src/main/java 目录”。因此,它不会显示两个插件通用项目中的任何源代码。
方法 3
plugin-common 中没有任何 pom.xml 文件,而是使用 build-helper-maven-plugin 将公共(public)代码作为源文件夹添加到 plugin-6.7 和 plugin-7.6 模块,使用 <source>${project.basedir}/../plugin-common/src/main/java</source>
.
由于“访问项目基目录之外的.../src/main/java 目录”警告,这在 Eclipse 中再次失败。
最佳答案
我现在选择了以下方法,效果很好。
Maven结构:
插件模块包含 3 个基础包:
plugin/pom.xml使用SonarQube API依赖和封装插件定义类似如下:
<dependency>
<groupId>org.sonarsource.sonarqube</groupId>
<artifactId>sonar-plugin-api</artifactId>
<version>${sonarqube.version}</version>
<scope>provided</scope>
</dependency>
<plugin>
<groupId>org.sonarsource.sonar-packaging-maven-plugin</groupId>
<artifactId>sonar-packaging-maven-plugin</artifactId>
<version>1.16</version>
<extensions>true</extensions>
<configuration>
<pluginKey>mykey</pluginKey>
<pluginClass>myproject.plugin.common.MyPlugin</pluginClass>
<pluginName>PluginName</pluginName>
<pluginDescription>Description</pluginDescription>
<useChildFirstClassLoader>true</useChildFirstClassLoader>
<sonarQubeMinVersion>6.7</sonarQubeMinVersion>
</configuration>
</plugin>
这允许插件与 SonarQube 6.7+ 一起工作,即使 API 依赖版本设置为 7.6(见下面的配置文件)。 MyPlugin 类是一个通用类,它使用 Java 反射加载特定于 6.7 或特定于 7.6 的实现,具体取决于运行插件的 SonarQube 版本。
最后,父pom.xml 定义了以下两个配置文件:
<profiles>
<profile>
<id>default</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<sonarqube.version>7.6</sonarqube.version>
</properties>
<modules>
<module>common</module>
<module>plugin</module>
<module>tool</module>
<module>dist</module>
</modules>
</profile>
<profile>
<id>checkSQ6.7Compatibility</id>
<activation>
<activeByDefault>false</activeByDefault>
</activation>
<properties>
<sonarqube.version>6.7</sonarqube.version>
</properties>
<modules>
<module>common</module>
<module>plugin</module>
</modules>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<excludes>
<exclude>**/sq76/**</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
默认配置文件现在构建一个与 SonarQube 6.7 及更高版本兼容的插件,如果在该版本的 SonarQube 上运行,则启用 7.6 特定的功能。
checkSQ6.7Compatibility 配置文件将 SonarQube API 版本覆盖为 6.7,排除任何 SonarQube 7.6 特定的文件夹,并且仅构建公共(public)模块和插件模块(跳过工具和 dist)。这允许验证通用包和特定于 6.7 的包是否可以使用 6.7 API 编译。
在 Eclipse 中,我现在使用默认配置文件进行常规开发,这让我可以同时处理 6.7 和 7.6 的特定代码。在进行任何重大更改后,我可以简单地在 Eclipse 项目配置中选择 checkSQ6.7Compatibility 配置文件,以验证我没有意外地引入对任何 7.6 特定 API 的依赖。
关于java - 如何在 Maven 和 Eclipse 中使用不同的依赖版本两次构建相同的源代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55824022/
我在 gobject 上阅读了一个维基百科页面,上面写着, Depending only on GLib and libc, GObject is a cornerstone of GNOME and
如何注册一个依赖属性,其值是使用另一个依赖属性的值计算的? 由于 .NET 属性包装器在运行时被 WPF 绕过,因此不应在 getter 和 setter 中包含逻辑。解决方案通常是使用 Proper
我一直在尝试将 ActionbarSherlock maven 依赖项添加到我的项目中 com.actionbarsherlock library 4.2.0 在我的 po
http://tutorials.jenkov.com/ood/understanding-dependencies.html#whatis说(强调我的): Whenever a class A us
我对所有这些魔法有点不清楚。 据我了解,依赖属性是从 DependencyObject 继承的,因此存储值: 如果分配了值(在本地字典中),则在实例本身中 或者如果未指定值,则从指向父元素的链接中获取
我刚刚更新了在 ASP.NET Framework 4.5.2 版上运行的 MVC Web 应用程序。我正在使用 Twilio 发送 SMS 消息: var twilio = new TwilioRe
我刚刚发现了一件令人生畏的事情。 spring 依赖坐标有两个版本。 项目依赖于 spring mvc 和 spring flow。有两组并行的依赖项。 Spring MVC 具有以下方案的依赖项
我正在尝试包含 的 maven 依赖项 org.jacorb jacorb 2.3.1 依赖已解决,但它导致另一个依赖 picocontainer 出现问题: [ERROR
我正在尝试在 Haskell 项目中包含特定版本的库。该库是住宿加早餐型的(用于 martix 操作),但我需要特定的 0.4.3 版本,该版本修复了乘法实现的错误。 所以,我的 stack.yaml
有谁知道如何制作依赖的 UIPickerView.例如,当我选择组件一的第 2 行时,组件二的标题会发生变化吗? 我在互联网上查找过,没有真正的答案,我尝试过使用 if 和 switch 语句,但它们
我正在编写一个用于验收测试的项目,由于各种原因,这依赖于另一个打包为 WAR 的项目。我已成功使用 maven-dependency-plugin 解压 WAR,但无法让我的项目包含解压的 WEB-I
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
开始玩 Scala futures,我被依赖的 futures 困住了。 让我们举个例子。我搜索地点并获得 Future[Seq[Place]]。对于这些地点中的每一个,我搜索最近的地铁站(该服务返回
或多或少我在 session 上大量构建我的网站(特别是重定向用户等),我很好奇这是否是一种危险的做法。禁用浏览器 cookie 保存的用户的大致比例是多少?我愿意接受任何建议:) 谢谢 最佳答案 s
我有一个二进制文件,需要一些 *.so 文件才能执行。现在,当我尝试在一些旧机器上执行它时,它会显示 /lib/libc.so.6: version `GLIBC_2.4' not found 如何将
我尝试使用 Dygraph 来表示图表,我在 https://github.com/danvk/dygraphs 中找到了代码,但是它有太多的依赖文件,我觉得很烦人。是否有一个文件可以容纳所有必需的
我正在处理一个 javascript 文件,该文件 a) 声明一个具有函数的对象,并且 b) 使用它期望在外部声明的散列调用该对象的 init 函数。我的 Jasmine 规范提示它找不到哈希,因为它
最近我一直在学习 Angular 并且进展顺利,但是关于依赖注入(inject)的一些事情我仍然不清楚。 是否有任何理由在我的 app.js 文件中声明我的应用程序的其他部分(服务、 Controll
考虑一个名为 foo 的表,它有 id (PRIMARY & AUTO_INCREMENT) 列。我正在向该表中插入一行,挑战从此时开始。 $db->query("INSERT INTO `foo`
我正在使用级联下拉 jquery 插件。 (https://github.com/dnasir/jquery-cascading-dropdown) 我有两个下拉菜单。 “客户端”和“站点”。 根据您
我是一名优秀的程序员,十分优秀!