无法让 biojava 在 Maven Netbeans 应用程序中工作
Can't get biojava to work in a Maven Netbeans application
我在让 BioJava 在使用 Maven 构建的 Netbeans RCP 应用程序中工作时遇到问题。我创建了一个 Maven 模块作为包装器,包括 org.biojava.* 和 org.forester.* 包作为 POM 中的 public。然后,我从另一个模块将包装器设置为依赖项,并使用 BioJava 说明书中的一些基本示例进行测试。
每当我尝试从 BioJava 实例化 class 的某些对象时,应用程序就会冻结,我必须使用 Windows 任务管理器将其终止。
这是包装器的 pom 文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>nl.hecklab.bioinformatics</groupId>
<artifactId>Spider-parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>BiojavaWrapper</artifactId>
<version>4.1.0</version>
<packaging>nbm</packaging>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>nbm-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<useOSGiDependencies>true</useOSGiDependencies>
<publicPackages>
<publicPackage>org.biojava.*</publicPackage>
<publicPackage>org.forester.*</publicPackage>
</publicPackages>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<useDefaultManifestFile>true</useDefaultManifestFile>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.biojava</groupId>
<artifactId>biojava-alignment</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
这是我尝试开始工作的一些代码。这只是一个非常粗糙的示例,从 TopComponent 中的按钮调用。输入和输出只是文本字段。
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Reader r = new Reader(new File("D:\current\fastafile.fasta"));
for (ProteinSequence a : r.getSequences()) {
input.append(a.toString());
}
Profile<ProteinSequence, AminoAcidCompound> profile = Alignments.getMultipleSequenceAlignment(r.sequences);
output.setText(String.format("Clustalw:%n%s%n", profile));
ConcurrencyTools.shutdown();
}
这是 reader class:
public class Reader {
List<ProteinSequence> sequences = new ArrayList<>();
public Reader(File fastaFile) {
try {
FileInputStream inStream = new FileInputStream(fastaFile);
FastaReader<ProteinSequence, AminoAcidCompound> fastaReader
= new FastaReader<>(
inStream,
new GenericFastaHeaderParser<ProteinSequence, AminoAcidCompound>(),
new ProteinSequenceCreator(AminoAcidCompoundSet.getAminoAcidCompoundSet()));
LinkedHashMap<String, ProteinSequence> b = fastaReader.process();
sequences.addAll(b.values());
} catch (IOException ex) {
Logger.getLogger(Reader.class.getName()).log(Level.SEVERE, null, ex);
}
}
public List<ProteinSequence> getSequences() {
return sequences;
}
}
在 (Netbeans) IDE 中,classes 被发现并用于自动完成,项目构建成功,在每种情况下都表明主要依赖项设置正确。
首先检查包装器模块的清单以查看是否正确生成了所有条目,特别是因为您定义了 useOSGiDependencies==true。可能是 biojava 罐子包含 osgi headers 然后你没有将罐子包装在模块中,而是声明对 osgi 插件的依赖。
然而,应用程序的锁定很奇怪,如果运行时依赖项有问题,我会预料到早期的 'unsatisfied dependencies' 错误。您可能想要创建一个线程转储并检查发生了什么。也许你有一个僵局。或者因为您的操作 (jButton1ActionPerformed) 是从 AWT 调用的,也许整个阅读过程需要时间并且您的 UI 线程被锁定。
我做了很多搜索,发现真正的罪魁祸首是 slf4j,它在整个 BioJava 中使用。
我不知道为什么它会冻结平台应用程序,但我可以通过在其中创建 slf4j 记录器来使我的模块无法安装。
我在网上看到了一个包装器模块的解决方案,事实证明它足以为 org.slf4j:slf4j-api:x.y.z
和 org.slf4j:slf4j-jdk14:x.y.z
创建一个包装器。将 org.slf4j.*
添加到 public 包中。这是 POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>group</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>slf4jwrapper</artifactId>
<packaging>nbm</packaging>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>nbm-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<publicPackages>
<publicPackage>org.slf4j.*</publicPackage>
</publicPackages>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<useDefaultManifestFile>true</useDefaultManifestFile>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.netbeans.api</groupId>
<artifactId>org-netbeans-api-annotations-common</artifactId>
<version>${netbeans.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.7</version>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
包装器应该在 BioJava 依赖模块中使用,但它也应该适用于依赖 slf4j 的其他模块。
我在让 BioJava 在使用 Maven 构建的 Netbeans RCP 应用程序中工作时遇到问题。我创建了一个 Maven 模块作为包装器,包括 org.biojava.* 和 org.forester.* 包作为 POM 中的 public。然后,我从另一个模块将包装器设置为依赖项,并使用 BioJava 说明书中的一些基本示例进行测试。
每当我尝试从 BioJava 实例化 class 的某些对象时,应用程序就会冻结,我必须使用 Windows 任务管理器将其终止。
这是包装器的 pom 文件:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>nl.hecklab.bioinformatics</groupId>
<artifactId>Spider-parent</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>BiojavaWrapper</artifactId>
<version>4.1.0</version>
<packaging>nbm</packaging>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>nbm-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<useOSGiDependencies>true</useOSGiDependencies>
<publicPackages>
<publicPackage>org.biojava.*</publicPackage>
<publicPackage>org.forester.*</publicPackage>
</publicPackages>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<useDefaultManifestFile>true</useDefaultManifestFile>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.biojava</groupId>
<artifactId>biojava-alignment</artifactId>
<version>4.1.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.12</version>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
</project>
这是我尝试开始工作的一些代码。这只是一个非常粗糙的示例,从 TopComponent 中的按钮调用。输入和输出只是文本字段。
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
Reader r = new Reader(new File("D:\current\fastafile.fasta"));
for (ProteinSequence a : r.getSequences()) {
input.append(a.toString());
}
Profile<ProteinSequence, AminoAcidCompound> profile = Alignments.getMultipleSequenceAlignment(r.sequences);
output.setText(String.format("Clustalw:%n%s%n", profile));
ConcurrencyTools.shutdown();
}
这是 reader class:
public class Reader {
List<ProteinSequence> sequences = new ArrayList<>();
public Reader(File fastaFile) {
try {
FileInputStream inStream = new FileInputStream(fastaFile);
FastaReader<ProteinSequence, AminoAcidCompound> fastaReader
= new FastaReader<>(
inStream,
new GenericFastaHeaderParser<ProteinSequence, AminoAcidCompound>(),
new ProteinSequenceCreator(AminoAcidCompoundSet.getAminoAcidCompoundSet()));
LinkedHashMap<String, ProteinSequence> b = fastaReader.process();
sequences.addAll(b.values());
} catch (IOException ex) {
Logger.getLogger(Reader.class.getName()).log(Level.SEVERE, null, ex);
}
}
public List<ProteinSequence> getSequences() {
return sequences;
}
}
在 (Netbeans) IDE 中,classes 被发现并用于自动完成,项目构建成功,在每种情况下都表明主要依赖项设置正确。
首先检查包装器模块的清单以查看是否正确生成了所有条目,特别是因为您定义了 useOSGiDependencies==true。可能是 biojava 罐子包含 osgi headers 然后你没有将罐子包装在模块中,而是声明对 osgi 插件的依赖。
然而,应用程序的锁定很奇怪,如果运行时依赖项有问题,我会预料到早期的 'unsatisfied dependencies' 错误。您可能想要创建一个线程转储并检查发生了什么。也许你有一个僵局。或者因为您的操作 (jButton1ActionPerformed) 是从 AWT 调用的,也许整个阅读过程需要时间并且您的 UI 线程被锁定。
我做了很多搜索,发现真正的罪魁祸首是 slf4j,它在整个 BioJava 中使用。
我不知道为什么它会冻结平台应用程序,但我可以通过在其中创建 slf4j 记录器来使我的模块无法安装。
我在网上看到了一个包装器模块的解决方案,事实证明它足以为 org.slf4j:slf4j-api:x.y.z
和 org.slf4j:slf4j-jdk14:x.y.z
创建一个包装器。将 org.slf4j.*
添加到 public 包中。这是 POM:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>group</groupId>
<artifactId>parent-project</artifactId>
<version>1.0.0</version>
</parent>
<artifactId>slf4jwrapper</artifactId>
<packaging>nbm</packaging>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>nbm-maven-plugin</artifactId>
<extensions>true</extensions>
<configuration>
<publicPackages>
<publicPackage>org.slf4j.*</publicPackage>
</publicPackages>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<useDefaultManifestFile>true</useDefaultManifestFile>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.netbeans.api</groupId>
<artifactId>org-netbeans-api-annotations-common</artifactId>
<version>${netbeans.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.7</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-jdk14</artifactId>
<version>1.7.7</version>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
包装器应该在 BioJava 依赖模块中使用,但它也应该适用于依赖 slf4j 的其他模块。