我目前正在开发一个 Spring Boot Starter,它将托管一个 Restful Web 服务,其中包含一些关于正在运行的应用程序的元数据。
我在从我的 mainfest 文件中提取我的 artifactId 和 versionId 时遇到困难。我相信我的问题是自动配置类是在主测试应用程序之前加载的,因此 list 尚无法被发现。我不确定我的逻辑是否正确,是否从错误的角度处理问题。
我最初关注以下tutorial进行设置。
这给了我 3 个独立的项目
没有上下文的通用 Spring 服务
这些服务的自动配置项目
Spring Boot 启动器
作为最终结果,我将启动器与测试项目配对。
目前 maven 正在与 Spring Boot 一起使用以生成 list 文件。
实现标题:MyExampleProjectWithCustomStarter
实现版本:0.0.1-SNAPSHOT
Archiver-版本:Plexus Archiver
builder :mcf
实现供应商 ID:com.coolCompany
Spring-Boot-版本:1.5.4.RELEASE
实现供应商:Pivotal Software, Inc.
主类:org.springframework.boot.loader.JarLauncher
启动类:com.coolcompany.SpringBootExampleApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
创建者:Apache Maven 3.5.0
构建-Jdk:1.8.0_131
实现-URL:http://someurl
但是,当我尝试从我的通用服务包中找到示例项目的 list 文件时,我找不到该文件。
private String getApplicationVersion(String applicationName, List<Attributes> manifests) {
String unknownVersion = "0.0.0-UNKNOWN";
for (Attributes attr : manifests) {
String title = attr.getValue(IMPL_TITLE);
String version = attr.getValue(IMPL_VERSION);
if (version != null) {
if (applicationName.equalsIgnoreCase(title)) {
return title + ' ' + version;
}
}
}
log.warn(
"Could not find MANIFEST file with '" + applicationName + "' as Implementation-Title."
+ " Meta-API will return buildVersion '" + unknownVersion + "'.");
return applicationName + ' ' + unknownVersion;
}
private List<Attributes> loadManifestFiles() {
List<Attributes> manifests = new ArrayList<>();
try {
Enumeration<URL> resources =
Thread.currentThread().getContextClassLoader().getResources("/META-INF/MANIFEST.MF");
while (resources.hasMoreElements()) {
URL url = resources.nextElement();
try (InputStream is = url.openStream()) {
manifests.add(new Manifest(is).getMainAttributes());
System.out.println("Manifest size:" + manifests.size());
} catch (IOException e) {
log.error("Failed to read manifest from " + url, e);
}
}
} catch (IOException e) {
log.error("Failed to get manifest resources", e);
}
return manifests;
}
当前 list 实现标题:
Spring Boot 网络启动器
Spring 启动启动器
Spring Boot
Spring Boot 自动配置
Spring Boot 日志启动器
无效的
无效的
jcl-over-slf4j
无效的
log4j-over-slf4j
无效的
Spring Boot Tomcat 启动器
Apache 汤姆猫
Apache 汤姆猫
Apache 汤姆猫
hibernate validator
无效的
JBoss 日志记录 3
同学
jackson 数据绑定(bind)
jackson 注释
jackson 核心
Spring 网
Spring AOP
Spring Bean
Spring 上下文
Spring webmvc
Spring 表达式
Spring 启动执行器启动器
Spring 启动执行器
无效的
** MyCustom-spring-boot-starter
** MyGenericSpringService
无效的
无效的
无效的
指标核心
指标的 JVM 集成
无效的
无效的
jackson 数据类型:JSR310
** MyService-spring-boot-autoconfigure
slf4j-api
Spring 芯
** 缺少 MyExampleProjectWithCustomStarter
list 记录数:44
最佳答案
经过大量努力,我找到了一个出奇简单的答案。 spring-boot-actuator 就是这样获取信息的。
Spring Boot Maven 插件配备了构建信息目标。只要在主项目中触发了此目标,Spring 就有一个 BuildProperties 类,您可以通过连接获取信息。
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<id>build-info</id>
<goals>
<goal>build-info</goal>
</goals>
</execution>
</executions>
</plugin>
您可以像这样访问启动器中的属性:
@Autowired
BuildProperties buildProperties;
...
buildProperties.getArtifact();
buildProperties.getVersion();
您甚至可以从插件中指定其他属性。有关详细信息,请参阅插件文档: https://docs.spring.io/spring-boot/docs/current/maven-plugin/build-info-mojo.html
不幸的是,我从来没有完全理解为什么我无法访问正确的 list ,但这应该可以帮助其他任何试图解决这个问题的人。
关于java - 在 Spring Boot Starter 中获取 ArtifactId 和版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44786871/
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/
我正在尝试修改当前依赖于定义为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之间的所有版本,你可以这
有没有办法在这个简单的get方法中添加超时选项?我正在使用法拉第3.3。Faraday.get(url)四处寻找,我只能先发起连接后应用超时选项,然后应用超时选项。或者有什么简单的方法?这就是我现在正在做的:conn=Faraday.newresponse=conn.getdo|req|req.urlurlreq.options.timeout=2#2secondsend 最佳答案 试试这个:conn=Faraday.newdo|conn|conn.options.timeout=20endresponse=conn.get(url
我有一个存储主机名的Ruby数组server_names。如果我打印出来,它看起来像这样:["hostname.abc.com","hostname2.abc.com","hostname3.abc.com"]相当标准。我想要做的是获取这些服务器的IP(可能将它们存储在另一个变量中)。看起来IPSocket类可以做到这一点,但我不确定如何使用IPSocket类遍历它。如果它只是尝试像这样打印出IP:server_names.eachdo|name|IPSocket::getaddress(name)pnameend它提示我没有提供服务器名称。这是语法问题还是我没有正确使用类?输出:ge
我想获取模块中定义的所有常量的值:moduleLettersA='apple'.freezeB='boy'.freezeendconstants给了我常量的名字:Letters.constants(false)#=>[:A,:B]如何获取它们的值的数组,即["apple","boy"]? 最佳答案 为了做到这一点,请使用mapLetters.constants(false).map&Letters.method(:const_get)这将返回["a","b"]第二种方式:Letters.constants(false).map{|c
如果我使用ruby版本2.5.1和Rails版本2.3.18会怎样?我有基于rails2.3.18和ruby1.9.2p320构建的rails应用程序,我只想升级ruby的版本,而不是rails,这可能吗?我必须面对哪些挑战? 最佳答案 GitHub维护apublicfork它有针对旧Rails版本的分支,有各种变化,它们一直在运行。有一段时间,他们在较新的Ruby版本上运行较旧的Rails版本,而不是最初支持的版本,因此您可能会发现一些关于需要向后移植的有用提示。不过,他们现在已经有几年没有使用2.3了,所以充其量只能让更
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
假设我有这个范围:("aaaaa".."zzzzz")如何在不事先/每次生成整个项目的情况下从范围中获取第N个项目? 最佳答案 一种快速简便的方法:("aaaaa".."zzzzz").first(42).last#==>"aaabp"如果出于某种原因你不得不一遍又一遍地这样做,或者如果你需要避免为前N个元素构建中间数组,你可以这样写:moduleEnumerabledefskip(n)returnto_enum:skip,nunlessblock_given?each_with_indexdo|item,index|yieldit
我正在尝试使用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