Процедура neo4j в зависимости от подписанного jar (mapdb) - PullRequest
2 голосов
/ 13 марта 2019

Я создал пользовательскую процедуру neo4j.Он также компилируется и работает в neo4j.

Недавно, однако, я добавил в свой плагин процедуры зависимость, которая не позволяет запускать neo4j при попытке запустить только что созданный jar.Конкретно, я получаю следующее исключение в нижней части трассировки стека:

Caused by: java.lang.SecurityException: Invalid signature file digest for Manifest main attributes

Единственное, что я изменил, - это добавление MapDB в мои зависимости.Поэтому я подозреваю, что это зависит от какого-то подписанного артефакта.Оказывается, плагины neo4j - это «uber-jars» (то есть затененные jar-файлы), которые не очень хорошо работают со знаковыми зависимостями.

Я подумал, что мог бы попытаться исключить MapDB из затенения, изменив область видимости.на provided и дополнительно добавив jar mapdb в папку плагинов neo4j.Таким образом, папка плагинов в neo4j теперь включает в себя и mapdb.jar, и myprocedure.jar.

Это, похоже, не работает: neo4j запускается, но при вызове моей процедуры я получаю ClassNotFound Exception.

Любые идеи о том, как я могу решить эту дилемму?Я действительно зависим от чего-то вроде MapDB, поскольку мой график очень большой, и постоянное хранение в памяти всех моих процедур приводит к исключениям памяти.

Заранее большое спасибо!


Важноечасть моего pom.xml должна помочь (я начал с шаблона процедуры , поэтому он все еще выглядит очень похоже):

<dependencies>

        <!-- other dependencies that don't make a difference ... -->

        <dependency>
            <groupId>org.mapdb</groupId>
            <artifactId>mapdb</artifactId>
            <version>3.0.7</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j</artifactId>
            <version>${neo4j.version}</version>
            <scope>provided</scope>
        </dependency>

        <!-- Test Dependencies -->
        <dependency>
            <groupId>org.neo4j.test</groupId>
            <artifactId>neo4j-harness</artifactId>
            <version>${neo4j.version}</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.neo4j.driver</groupId>
            <artifactId>neo4j-java-driver</artifactId>
            <version>1.4.2</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.1</version>
                <configuration>
                    <!-- Neo4j Procedures require Java 8 -->
                    <source>1.8</source>
                    <target>1.8</target>
                </configuration>
            </plugin>
            <plugin>
                <!-- This generates a jar-file with our procedure code,
                     plus any dependencies marked as `compile` scope.
                     This should then be deployed in the `plugins` directory
                     of each Neo4j instance in your deployment.
                     After a restart, the procedure is available for calling. -->
                <artifactId>maven-shade-plugin</artifactId>
                <version>2.4.3</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

Я не знаю, что neo4j проверяет любые подписи jar по умолчанию. Я подозреваю, что виновником является переупаковка артефакта mapdb.

Чтобы проверить это, удалите плагин shade или Assembly и создайте банку, которая содержит только ваш код. Скопируйте этот jar и mapdb.jar в папку плагина и просмотрите журналы во время перезапуска.

0 голосов
/ 13 марта 2019

Итак, одним из решений было использование maven-assembly-plugin вместо maven-shade-plugin.Плагин сборки создает автономный jar со всеми зависимостями без повторной упаковки всех зависимостей.

Конечно, мне пришлось удалить <scope>provided</scope> для mapdb, поэтому он также включен в собранный jar.

Остальное просто заменяет плагин Shade следующим фрагментом (благодаря этому вопросу здесь ):

<plugin>
    <artifactId>maven-assembly-plugin</artifactId>
    <executions>
        <execution>
            <phase>package</phase>
            <goals>
                <goal>single</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <descriptorRefs>
            <descriptorRef>jar-with-dependencies</descriptorRef>
        </descriptorRefs>
    </configuration>
</plugin>

Впоследствии я получил еще одно исключение, которое, по моему мнению, было связано с неверной подписью:

Caused by: java.lang.VerifyError ...

Оказывается, это было только потому, что у меня была другая процедура в neo4j, которая использует те же зависимости, что и mapdb.Быстрым решением было удалить эту библиотеку процедур.

Конечно, есть и другие решения, в том числе удаление подписи или повторная подпись.Однако я явно не хотел удалять какие-либо подписи.

...