4

Maven プロジェクトで JUnit 内から Voldemort を使用しようとしています。次のコードはコンパイルされますが、正常に実行されません。

@Before
public void setUp() throws Exception
{
    // Start Voldemort
    VoldemortConfig config = VoldemortConfig.loadFromEnvironmentVariable();
    VoldemortServer server = new VoldemortServer(config);
    server.start();
}

代わりに、次の例外がスローされます。

java.lang.UnsatisfiedLinkError: voldemort.utils.JNAUtils.mlockall(I)I
    at voldemort.utils.JNAUtils.mlockall(Native Method)
    at voldemort.utils.JNAUtils.tryMlockall(JNAUtils.java:51)
    at voldemort.server.VoldemortServer.startInner(VoldemortServer.java:251)
    at voldemort.server.AbstractService.start(AbstractService.java:62)
    at a.b.c.FunctionalTest.setUp(FunctionalTest.java:34)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:27)
    at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:30)
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300)
    at org.apache.maven.surefire.junit4.JUnit4TestSet.execute(JUnit4TestSet.java:35)
    at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:115)
    at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:97)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.maven.surefire.booter.ProviderFactory$ClassLoaderProxy.invoke(ProviderFactory.java:103)
    at $Proxy0.invoke(Unknown Source)
    at org.apache.maven.surefire.booter.SurefireStarter.invokeProvider(SurefireStarter.java:150)
    at org.apache.maven.surefire.booter.SurefireStarter.runSuitesInProcess(SurefireStarter.java:91)
    at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:69)

これを修正する方法はありますか?

4

1 に答える 1

2

スタックトレースでこの行に注意してください

voldemort.utils.JNAUtils.mlockall (ネイティブ メソッド) で

これは、呼び出されているコードが何であれ、 を通じて何らかのネイティブ ライブラリを使用していることを示していますJNIUnsatisfiedLinkedErrorこれは、ロードを要求するクラスのロード時に JVM がネイティブ ライブラリをロードできない場合に発生します。

コードで ddl / so ファイルを確実にロードできるようにするには、次の Java システム プロパティを使用します。

-Djava.library.path=/path/to/directory/containing/native/libraries

または、同じディレクトリをPATHWindows の環境変数またはLD_LIBRARY_PATHLinux の変数に追加することもできます。

http://maven.apache.org/plugins/maven-surefire-plugin/examples/system-properties.htmlを確認してください。このページmaven-surefire-pluginでは、Maven でのテストの実行を担当するシステム プロパティを渡す方法について説明しています。

于 2012-10-11T07:58:14.723 に答える