Can';不要让biojava在Maven Netbeans应用程序中工作

Can';不要让biojava在Maven Netbeans应用程序中工作,java,maven,netbeans,netbeans-platform,biojava,Java,Maven,Netbeans,Netbeans Platform,Biojava,我在让BioJava在使用Maven构建的Netbeans RCP应用程序中工作时遇到了一个问题。我已经创建了一个Maven模块作为包装器,包括org.biojava.*和org.forester.*在POM中作为公共包。然后,在另一个模块中,我将包装器设置为依赖项,并使用BioJava cookbook中的一些基本示例进行测试 每当我尝试从BioJava实例化某个类的对象时,应用程序就会冻结,我必须使用Windows任务管理器将其杀死 以下是包装器的pom文件: <?xml ve

我在让BioJava在使用Maven构建的Netbeans RCP应用程序中工作时遇到了一个问题。我已经创建了一个Maven模块作为包装器,包括org.biojava.*和org.forester.*在POM中作为公共包。然后,在另一个模块中,我将包装器设置为依赖项,并使用BioJava cookbook中的一些基本示例进行测试

每当我尝试从BioJava实例化某个类的对象时,应用程序就会冻结,我必须使用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>

4.0.0
nl.hecklab.生物信息学
蜘蛛亲本
1.0.0
生物爪哇包装器
4.1.0
nbm
org.codehaus.mojo
nbm maven插件
真的
真的
org.biojava*
org.forester*
org.apache.maven.plugins
maven jar插件
真的
org.biojava
biojava对齐
4.1.0
org.slf4j
slf4j api
1.7.12
UTF-8
下面是一些我试图开始工作的代码。这只是一个非常粗糙的示例,从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();


}     
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){
读卡器r=新读卡器(新文件(“D:\\current\\fastafile.fasta”);
对于(ProteinSequence a:r.getSequences()){
input.append(a.toString());
}
纵断面=路线。getMultipleSequenceAlignment(r.序列);
output.setText(String.format(“Clustalw:%n%s%n”,profile));
ConcurrencyTools.shutdown();
}     
以下是reader类:

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;
    }

}
公共类读取器{
列表序列=新的ArrayList();
公共读取器(文件fastaFile){
试一试{
FileInputStream inStream=新的FileInputStream(fastaFile);
FastaReader FastaReader
=新FastaReader(
河道内,
新的GenericFastaHeaderParser(),
新的蛋白质测序仪(氨基酸复合物集。GetAminoacid复合物集());
LinkedHashMap b=fastaReader.process();
sequences.addAll(b.values());
}捕获(IOEX异常){
Logger.getLogger(Reader.class.getName()).log(Level.SEVERE,null,ex);
}
}
公共列表getSequences(){
返回序列;
}
}

在(Netbeans)IDE中,在自动完成中找到并使用类,并且项目成功构建,在每种情况下都表明依赖项设置正确。

首先检查包装器模块的清单,查看是否正确生成了所有条目,特别是因为您定义了useosgidependency==true。可能是biojava JAR包含osgi头,然后您没有将JAR包装在模块中,而是声明对osgi插件的依赖关系


然而,应用程序的锁定是很奇怪的,如果运行时依赖项有问题,我会预料到早期的“未满足依赖项”错误。您可能需要创建一个线程转储并检查发生了什么。也许你遇到了僵局。或者,由于您的操作(jButton1ActionPerformed)是从AWT调用的,可能整个读取过程都需要时间,您的UI线程被锁定。

首先检查包装器模块的清单,查看是否正确生成了所有条目,特别是在您定义Useosgidependency==true的情况下。可能是biojava JAR包含osgi头,然后您没有将JAR包装在模块中,而是声明对osgi插件的依赖关系


然而,应用程序的锁定是很奇怪的,如果运行时依赖项有问题,我会预料到早期的“未满足依赖项”错误。您可能需要创建一个线程转储并检查发生了什么。也许你遇到了僵局。或者,由于您的操作(jButton1ActionPerformed)是从AWT调用的,可能整个阅读过程都需要时间,您的UI线程被锁定。

我做了大量搜索,发现真正的罪魁祸首是slf4j,这在整个BioJava中都被使用。 我不知道为什么它会冻结平台应用程序,但我可以通过在其中创建slf4j记录器使我的模块无法安装。 我在网上看到了一个包装器模块的解决方案,结果证明,为
org.slf4j:slf4j api:x.y.z
以及
org.slf4j:slf4j-jdk14:x.y.z
创建一个包装器就足够了。将
org.slf4j.*
添加到公共包中。以下是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>

4.0.0
组
父项目
1.0.0
slf4jwrapper
nbm
org.codehaus.mojo
nbm maven插件
真的
org.slf4j*
org.apache.maven.plugins
maven jar插件
真的
org.netbeans.api
org netbeansapi注释通用
${netbeans.version}
org.slf4j
slf4j api
1.7.7
org.slf4j
slf4j-jdk14
1.7.7
UTF-8


然后,包装器应该在依赖于BioJava的模块中使用,但它也应该适用于依赖于slf4j的其他模块。

我做了大量搜索,发现真正的罪魁祸首是slf4j,整个BioJava都在使用它。 我不知道为什么它会冻结平台应用程序,但我可以通过创建slf4j使我的模块无法安装