换行忽略正则表达式以在清单文件中查找包名称

时间:2015-03-18 09:30:32

标签: java regex osgi manifest

以下面的清单文件为例:

Manifest-Version: 1.0
Bnd-LastModified: 1418226794711
Build-Jdk: 1.7.0_67
Built-By: ubuntu
Bundle-Description: Camel FTP support
Bundle-DocURL: http://www.apache.org/
Bundle-License: http://www.apache.org/licenses/LICENSE-2.0.txt
Bundle-ManifestVersion: 2
Bundle-Name: camel-ftp
Bundle-SymbolicName: org.apache.camel.camel-ftp
Bundle-Vendor: The Apache Software Foundation
Bundle-Version: 2.14.1
Created-By: Apache Maven Bundle Plugin
Export-Package: org.apache.camel.component.file.remote;uses:="com.jcraft
 .jsch,org.slf4j,org.apache.camel.util,org.apache.camel.component.file,o
 rg.apache.camel,org.apache.commons.net.ftp,org.apache.camel.spi,org.apa
 che.camel.util.jsse,javax.net.ssl,org.apache.camel.impl,org.apache.came
 l.processor.idempotent";version="2.14.1",org.apache.camel.component.fil
 e.remote.strategy;uses:="org.apache.camel.util,org.apache.camel.compone
 nt.file,org.apache.camel,org.apache.commons.net.ftp,org.slf4j,org.apach
 e.camel.component.file.strategy,com.jcraft.jsch";version="2.14.1"
Export-Service: org.apache.camel.spi.ComponentResolver;component=ftp,org
 .apache.camel.spi.ComponentResolver;component=ftps,org.apache.camel.spi
 .ComponentResolver;component=sftp
Implementation-Title: Apache Camel
Implementation-Version: 2.14.1
Import-Package: com.jcraft.jsch;version="[0.1.40,0.2)",javax.net.ssl,org
 .apache.camel;version="[2.14,2.15)",org.apache.camel.component.file;ver
 sion="[2.14,2.15)",org.apache.camel.component.file.strategy;version="[2
 .14.1,2.14.2)",org.apache.camel.impl;version="[2.14,2.15)",org.apache.c
 amel.processor.idempotent;version="[2.14,2.15)",org.apache.camel.spi;ve
 rsion="[2.14,2.15)",org.apache.camel.util;version="[2.14,2.15)",org.apa
 che.camel.util.jsse;version="[2.14,2.15)",org.apache.commons.net.ftp;ve
 rsion="[3.3,4)",org.slf4j;version="[1.6,2)"
Karaf-Info: Camel;camel-ftp=2.14.1
Tool: Bnd-1.50.0

在寻找依赖性问题时,在我的项目清单中搜索特定包是很常见的。但是由于换行,很难找到它们。例如,如果我将 org.apache.camel.component.file.remote.strategy 视为简单文本,则无法找到它,因为在 org.apache之后有一个换行符.camel.component.fil

你能想象任何正则表达式可用于搜索忽略任何位置的换行符的文本吗?正则表达式有可能吗?请提供一个示例正则表达式来查找 org.apache.camel.component.file.remote.strategy !是否有任何替代解决方案可以轻松搜索清单?

2 个答案:

答案 0 :(得分:3)

为什么不使用Manifest类来处理MANIFEST文件?您可以使用接受InputStream的构造函数。

解析清单后,您可以获得所需的特定属性(我猜测你的导出包装)。

同样,如果使用正则表达式,您可能会错误地在Export-Package子句的某个属性或指令中找到包(例如:在uses指令中)。因此,我建议您使用felix utils库来解析每个子句。

一个例子:

String searchedPackageName = "org.apache.camel.component.file.remote.strategy";

Manifest manifest = new Manifest(streamOfTheManifest);
String exportPackageHeader = manifest.getMainAttributes().getValue("Export-Package");

// Parser and clause comes from org.apache.felix.utils.manifest package
Clause[] clauses = Parser.parseHeader(exportPackageHeader);

for (Clause exportPackageClause : clauses) {
    String exportedPackageName = exportPackageClause.getName();
    if (searchedPackageName.equals(exportedPackageName) {
    // Do your stuff here
  }
}

答案 1 :(得分:1)

使用您的搜索字词和

  • 逃离RegEx特殊字符,例如。 - > \。
  • 添加" \ s *"在所有角色之间

并确保使用dotall和Multiline运行您的RegEx。

用于RegEx开发的非常好的工具是http://sourceforge.net/projects/quickrex/

上的eclipse插件

可以通过我编写的一个小型FileSearch库来实现Manifest中的搜索。这允许cmd行执行" java -jar ..."。这个lib的目的最初是你的任务描述 - bundle内的依赖研究及其MANIFEST.MF文件。 来源在这里https://github.com/peterkir/klib.io