簡體   English   中英

從ImageJ / Fiji腳本導入外部庫/包

[英]Importing external libraries/Packages from an ImageJ/Fiji script

我正在使用Fiji腳本編輯器在Jython中編寫imageJ / Fiji插件。 我需要導入外部數值庫,例如ParallelColt,以幫助我處理多維矩陣。

我從ParallelColt開始,將其jar文件放在斐濟內部的java文件夾中:“ Fiji.app/java/macosx-java3d/Home/lib/ext”,然后嘗試通過編寫以下內容來導入:“ import ParallelColt”或更具體地是“ from “ ParallelColt import jplasma”,但出現未找到模塊的錯誤。

我嘗試將罐子放在Fiji plugins文件夾中,但仍然沒有成功。 我還嘗試通過將文件夾與ParallelColt的所有Java類一起使用,而不是jar文件,但仍然無法從腳本中導入這些類。

也許我只是問一個問題,即如何從Jython腳本導入Java庫。 任何幫助將不勝感激。

這里有兩個問題。

1.依存關系

為了依賴具有多個JAR文件的復雜的第三方軟件項目,您需要確保已將項目的所有依賴項(即,它需要的所有JAR文件)放入ImageJ.app/jars

一種方法是找到Maven Central上的依賴項 ,然后使用Maven或Gradle之類的構建工具下載它們。

在您的情況下,可以通過制作以下pom.xml文件來使用Maven做到這一點:

<?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>

  <groupId>dummy</groupId>
  <artifactId>dummy</artifactId>
  <version>0.0.0-SNAPSHOT</version>

  <dependencies>
    <dependency>
      <groupId>net.sourceforge.parallelcolt</groupId>
      <artifactId>parallelcolt</artifactId>
      <version>0.10.1</version>
    </dependency>
    <dependency>
      <groupId>net.mikera</groupId>
      <artifactId>vectorz</artifactId>
      <version>0.34.0</version>
    </dependency>
  </dependencies>

</project>

然后執行:

mvn dependency:copy-dependencies

這將在target/dependencies文件夾中產生以下文件:

  29087 AMDJ-1.0.1.jar
   8687 BTFJ-1.0.1.jar
  19900 COLAMDJ-1.0.1.jar
  55638 JKLU-1.0.0.jar
1194003 arpack_combined_all-0.1.jar
  31162 core-lapack-0.1.jar
 212836 csparsej-1.1.1.jar
  88639 edn-java-0.4.4.jar
  91793 jplasma-1.2.0.jar
 762778 jtransforms-2.4.0.jar
 237344 junit-4.8.2.jar
   8693 mathz-0.3.0.jar
 131210 netlib-java-0.9.3.jar
  66134 optimization-1.0.jar
4111744 parallelcolt-0.10.1.jar
  14028 randomz-0.3.0.jar
 593015 vectorz-0.34.0.jar

將它們移到ImageJ.app/jars文件夾中,就可以了,盡管請注意同一庫的多個版本,因為ImageJ現在無法處理該版本。

2.類參考

from ParallelColt import jplasma的行無效。 也就是說,沒有ParallelColt.jplasma Java類或包。 您可以從命令行親自驗證:

$ find-class() { for f in *.jar; do result=$(jar tf "$f" | grep -l "$@"); if [ "$result" != "" ]; then echo $f; fi; done; }
$ cd ImageJ.app/jars
$ find-class jplasma

兩個JAR文件具有包含該字符串的類:

core-lapack-0.1.jar
jplasma-1.2.0.jar

快速瀏覽一下它們,可以發現程序包名稱並非以ParallelColt開頭:

$ jar tf jplasma-1.2.0.jar | grep jplasma
edu/emory/mathcs/jplasma/
edu/emory/mathcs/jplasma/benchmark/
edu/emory/mathcs/jplasma/test/
edu/emory/mathcs/jplasma/tdouble/
edu/emory/mathcs/jplasma/example/
edu/emory/mathcs/jplasma/benchmark/DgelsBenchmark.class
edu/emory/mathcs/jplasma/benchmark/DposvBenchmark.class
edu/emory/mathcs/jplasma/benchmark/DgesvBenchmark.class
edu/emory/mathcs/jplasma/Barrier.class
edu/emory/mathcs/jplasma/test/DposvTest.class
edu/emory/mathcs/jplasma/test/DgelsTest.class
edu/emory/mathcs/jplasma/test/DgesvTest.class
edu/emory/mathcs/jplasma/tdouble/Dgels.class
edu/emory/mathcs/jplasma/tdouble/Dgeqrf.class
edu/emory/mathcs/jplasma/tdouble/Dglobal$Dplasma_cntrl.class
edu/emory/mathcs/jplasma/tdouble/Dplasma.class
...
edu/emory/mathcs/jplasma/tdouble/Dglobal$Dplasma_aux.class
edu/emory/mathcs/jplasma/tdouble/Pdormqr.class
edu/emory/mathcs/jplasma/example/DposvExample.class
edu/emory/mathcs/jplasma/example/DgesvExample.class
edu/emory/mathcs/jplasma/example/DgelsExample.class

相反,如果您想使用edu.emory.mathcs.jplasma.tdouble.Dplasma ,則需要將其導入為:

from edu.emory.mathcs.jplasma.tdouble import Dplasma

這是來自JPlasma發行版的DgelsExample.java的端口,可在ImageJ腳本編輯器中使用:

from edu.emory.mathcs.jplasma.tdouble import Dplasma
from java.lang import Math
import jarray

M = 15;
N = 10;
NRHS = 5;

A = jarray.zeros(M * N, 'd')
B = jarray.zeros(M * NRHS, 'd')

# Initialize A
for i in range(0, M):
    for j in range(0, N):
        A[M * j + i] = 0.5 - Math.random()

# Initialize B
for i in range(0, M):
    for j in range(0, NRHS):
        B[M * j + i] = Math.random()

# Plasma Initialize
Dplasma.plasma_Init(M, N, NRHS)

# Allocate T
T = Dplasma.plasma_Allocate_T(M, N)

# Solve the problem
INFO = Dplasma.plasma_DGELS(Dplasma.PlasmaNoTrans, M, N, NRHS, A, 0, M, T, 0, B, 0, M)

# Plasma Finalize
Dplasma.plasma_Finalize()

if INFO < 0:
    print("-- Error in DgelsExample example !")
else:
    print("-- Run successfull !")

有關編寫Jython腳本的更多信息,請參見ImageJ Wiki的Jython腳本頁面。

最后一個分期評論:ImageJ腳本編輯器實際上是一種工具,用於開發依賴於安裝中已經存在的組件的單類腳本和插件。 我對這樣一個具有很多依賴項的項目的建議是,改為使用諸如Eclipse之類的IDE在Java中進行編碼,因為此類IDE提供了更多的生產力增強功能。 您可以使用基於AST的自動完成功能來瀏覽正在使用的庫的API,並且無需進行網絡搜索即可輕松瀏覽javadocs和源。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM