警告:发生非法的反射访问操作(java中的portable opencv)

警告:发生非法的反射访问操作(java中的portable opencv),java,maven,opencv,java-9,javacv,Java,Maven,Opencv,Java 9,Javacv,我想制作一个可移植的opencv应用程序,将依赖项添加到maven文件pom.xml 简化代码为: import org.opencv.core.Mat; public class Builder { public static void main(String[] args) { nu.pattern.OpenCV.loadShared(); System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRAR

我想制作一个可移植的
opencv
应用程序,将依赖项添加到maven文件
pom.xml

简化代码为:

import org.opencv.core.Mat;

public class Builder {

    public static void main(String[] args) {

        nu.pattern.OpenCV.loadShared();
        System.loadLibrary(org.opencv.core.Core.NATIVE_LIBRARY_NAME);

        Mat mat = new Mat(4,3,1);
        System.out.println(mat.dump());
    }
}
我将此添加到
pom.xml

<dependency>
      <groupId>org.openpnp</groupId>
      <artifactId>opencv</artifactId>
      <version>3.2.0-0</version>
      <scope>compile</scope>
</dependency>

org.openpnp

如果我忽略此警告,并且不使用警告消息中提到的命令链接库,该怎么办? 因为用java使opencv可移植非常简单,我想知道如果没有问题,以后继续使用这种方法

我使用JDK 9,Eclipse Oxygen.2,Fedora 27


将来,应用程序的目标可能是windows。

这是因为Java 9对非法访问进行了新的检查,并且在Java 9发布后,通常会出现此类安全警告。永久的解决方案是向维护人员报告错误,并等待他们发布补丁更新


但是,只有在您自己承担风险的情况下,您才可以继续而不使用安全功能,即堆栈保护,这取决于您的使用情况和讨论中的此软件包的范围。

自Java update 9以来,出现了“非法反射访问操作已发生”警告

当我从jdk1.8升级到jdk9+(jdk11有更多的支持)时,我在多个项目中修改了pom.xml文件,从Maven Build和Maven Install解决了这个问题。以下是两个示例,用于消除“已发生非法反射访问操作”生成消息:

将版本更改为:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <warSourceDirectory>WebContent</warSourceDirectory>
            <webXml>WebContent\WEB-INF\web.xml</webXml>
        </configuration>
    </plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.5.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

org.apache.maven.plugins
maven战争插件
2.4
网络内容
WebContent\WEB-INF\WEB.xml
致:


org.apache.maven.plugins
maven战争插件
3.3.1
网络内容
WebContent\WEB-INF\WEB.xml
并将artifactId和版本从:

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.4</version>
        <configuration>
            <warSourceDirectory>WebContent</warSourceDirectory>
            <webXml>WebContent\WEB-INF\web.xml</webXml>
        </configuration>
    </plugin>
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.5.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>

org.apache.maven.plugins
maven编译器插件
3.5.1
1.8
1.8
UTF-8
致:


1.8
1.8
UTF-8
..
org.apache.maven.plugins
maven战争插件
3.3.1
..

当我重新运行Maven Build(clean compile package)或Maven Install时,“非法反射访问操作已经发生”就消失了。

看起来它正在侵入java.lang.ClassLoader中的一个私有字段。可能是此库的作者不知道System.load(您在其中指定库的文件路径而不是库的名称)。@AlanBateman我可以做些什么来修复它吗?我对GitHub发表了评论,并请作者看看这个问题。对不起,我不知道opencv,但向维护者问题跟踪者提交一个问题似乎是解决这个问题的正确方法。这发生在我为
org.codehaus.groovy:groovy eclipse批处理
插件将项目从Java 8升级到Java 11时。将其从版本2.4.16-02升级到3.0.1-01(迄今为止的最新版本)成功地解决了问题,并使警告消息在构建过程中消失。因此,要求或寻找一个新版本绝对是解决这个问题的办法。
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.5.1</version>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <encoding>UTF-8</encoding>
    </configuration>
</plugin>
<properties>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
    
    ..
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>3.3.1</version>
    </plugin>
    ..
</build>