2015-08-13 4 views
2

Я использую плагин org.eclipse.virgo.bundlor для создания файлов манифеста OSGi из шаблона. Когда я использую lambdas, плагин работает неправильно. Можете ли вы предложить изменить мой файл maven или альтернативу пакету, который позволит мне использовать лямбда?Bundlor не работает должным образом с Java 8 lambdas

Вот мой pom.xml

<?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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>lamba</groupId> 
    <artifactId>lamba</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>lamba</name> 
    <properties> 
    <java-source-version>1.8</java-source-version> 
    <java-target-version>1.8</java-target-version> 
    </properties> 
    <build> 
    <finalName>${project.artifactId}</finalName> 
    <plugins> 
     <plugin> 
     <groupId>org.eclipse.virgo.bundlor</groupId> 
     <artifactId>org.eclipse.virgo.bundlor.maven</artifactId> 
     <version>1.1.2.RELEASE</version> 
     <dependencies> 
      <dependency> 
      <groupId>org.eclipse.virgo.bundlor</groupId> 
      <artifactId>org.eclipse.virgo.bundlor</artifactId> 
      <version>1.1.2.RELEASE</version> 
      </dependency> 
      <dependency> 
      <groupId>org.eclipse.virgo.bundlor</groupId> 
      <artifactId>org.eclipse.virgo.bundlor.blint</artifactId> 
      <version>1.1.2.RELEASE</version> 
      </dependency> 

     </dependencies> 


     <executions> 
      <execution> 
      <id>${project.artifactId}-bundle-manifest</id> 
      <phase>prepare-package</phase> 
      <goals> 
       <goal>bundlor</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
      <source>${java-source-version}</source> 
      <target>${java-target-version}</target> 
      <skip>false</skip> 
      </configuration> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

код, который вызывает проблему просто так:

package lamba.internal; 

import java.util.function.Supplier; 

/** 
* 
*/ 
public class HiImpl { 
    public Supplier<String> p=()->"hi"; 

} 

Моя ошибка заключается в следующем:

[INFO] --- org.eclipse.virgo.bundlor.maven:1.1.2.RELEASE:bundlor (lamba-bundle-manifest) @ lamba --- 
java.lang.ArrayIndexOutOfBoundsException: 28712 
    at org.objectweb.asm.ClassReader.<init>(Unknown Source) 
    at org.objectweb.asm.ClassReader.<init>(Unknown Source) 
    at org.objectweb.asm.ClassReader.<init>(Unknown Source) 
    at org.eclipse.virgo.bundlor.support.asm.AsmTypeArtifactAnalyzer.analyse(AsmTypeArtifactAnalyzer.java:37) 
    at org.eclipse.virgo.bundlor.support.StandardManifestGenerator.analyzeEntry(StandardManifestGenerator.java:114) 
    at org.eclipse.virgo.bundlor.support.StandardManifestGenerator.analyzeEntries(StandardManifestGenerator.java:99) 
    at org.eclipse.virgo.bundlor.support.StandardManifestGenerator.generate(StandardManifestGenerator.java:64) 
    at org.eclipse.virgo.bundlor.maven.plugin.internal.MavenBundlorExecutor.execute(MavenBundlorExecutor.java:68) 
    at org.eclipse.virgo.bundlor.maven.plugin.BundlorMojo.execute(BundlorMojo.java:222) 
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:133) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153) 
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:108) 
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:76) 
    at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51) 
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:116) 
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:361) 
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:155) 
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:584) 
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:213) 
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:157) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415) 
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356) 
Manifest written to '/Users/me/proj/lamba/target/classes/META-INF/MANIFEST.MF' 

Update, я попытался используя более новую версию библиотеки ASM, но это не помогло:

<?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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>lamba</groupId> 
    <artifactId>lamba</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <name>lamba</name> 
    <properties> 
    <java-source-version>1.8</java-source-version> 
    <java-target-version>1.8</java-target-version> 
    </properties> 

    <build> 
    <finalName>${project.artifactId}</finalName> 

    <plugins> 
     <plugin> 
     <groupId>org.eclipse.virgo.bundlor</groupId> 
     <artifactId>org.eclipse.virgo.bundlor.maven</artifactId> 
     <version>1.1.2.RELEASE</version> 

     <dependencies> 
      <dependency> 
      <groupId>org.eclipse.virgo.bundlor</groupId> 
      <artifactId>org.eclipse.virgo.bundlor</artifactId> 
      <version>1.1.2.RELEASE</version> 
      <exclusions> 
       <exclusion> 
        <groupId>org.objectweb.asm</groupId> 
        <artifactId>com.springsource.org.objectweb.asm</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>org.objectweb.asm</groupId> 
        <artifactId>com.springsource.org.objectweb.asm.tree</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>org.objectweb.asm</groupId> 
        <artifactId>com.springsource.org.objectweb.asm.commons</artifactId> 
       </exclusion> 
      </exclusions> 
      </dependency> 
      <dependency> 
      <groupId>org.eclipse.virgo.bundlor</groupId> 
      <artifactId>org.eclipse.virgo.bundlor.blint</artifactId> 
      <version>1.1.2.RELEASE</version> 
       <exclusions> 
       <exclusion> 
        <groupId>org.objectweb.asm</groupId> 
        <artifactId>com.springsource.org.objectweb.asm</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>org.objectweb.asm</groupId> 
        <artifactId>com.springsource.org.objectweb.asm.tree</artifactId> 
       </exclusion> 
       <exclusion> 
        <groupId>org.objectweb.asm</groupId> 
        <artifactId>com.springsource.org.objectweb.asm.commons</artifactId> 
       </exclusion> 
      </exclusions> 
      </dependency> 


      <dependency> 
       <groupId>org.objectweb.asm</groupId> 
       <artifactId>com.springsource.org.objectweb.asm.commons</artifactId> 
       <version>3.2.0</version> 
       <scope>compile</scope> 
      </dependency> 
     </dependencies> 


     <executions> 
      <execution> 
      <id>${project.artifactId}-bundle-manifest</id> 
      <phase>prepare-package</phase> 
      <goals> 
       <goal>bundlor</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <version>3.1</version> 
      <configuration> 
      <source>${java-source-version}</source> 
      <target>${java-target-version}</target> 
      <skip>false</skip> 
      </configuration> 
     </plugin> 
    </plugins> 

    </build> 




</project> 

ответ

1

Насколько я знаю, плагин bundlor больше не обновляется, и вряд ли он будет усилен для понимания байт-кода Java 8.

Доступны две основные альтернативы, основанные на инструменте под названием bnd, который используется множеством проектов OSGi.

В проекте bnd размещен плагин с именем bnd-maven-plugin. Существует пример проект с использованием его here, и он может быть легко добавлен к вашему П следующим образом:

<plugin> 
    <groupId>biz.aQute.bnd</groupId> 
    <artifactId>bnd-maven-plugin</artifactId> 
    <version>2.4.1</version> 

    <executions> 
    <execution> 
     <goals> 
     <goal>bnd-process</goal> 
     </goals> 
    </execution> 
    </executions> 
</plugin> 

Обратите внимание, что для того, чтобы забрать БНД генерироваться явить вам также потребуется указать Maven-JAR- плагин, чтобы вытащить его в Обычно вы бы добавить что-то вроде этого к родительскому пОМ:.

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <configuration> 
    <useDefaultManifestFile>true</useDefaultManifestFile> 
    </configuration> 
</plugin> 

bnd-maven-plugin тянет конфигурацию из файла под названием bnd.bnd, документация для которых доступна here

Другой инструмент, основанный на bnd, называется maven-bundle-plugin и размещен Apache Felix. Документация видна here и рассказывает вам, как настроить pom.

<plugin> 
    <groupId>org.apache.felix</groupId> 
    <artifactId>maven-bundle-plugin</artifactId> 
    <extensions>true</extensions> 
    <configuration> 
    <instructions> 
     <Export-Package>org.foo.myproject.api</Export-Package> 
     <Private-Package>org.foo.myproject.*</Private-Package> 
     <Bundle-Activator>org.foo.myproject.impl1.Activator</Bundle-Activator> 
    </instructions> 
    </configuration> 
</plugin> 

Как вы можете видеть Maven-расслоением-плагин требует, чтобы вы либо изменить тип упаковки вашего модуля bundle или продлить жизненный цикл по умолчанию, так что он может упаковать вещи правильно. В результате он не всегда хорошо играет с другими инструментами, основанными на maven. Он широко используется.

Мое личное предпочтение для bnd-maven-plugin (я - коммандер bnd/bndtools), но оба, вероятно, подходят вам.

1

Проблема в том, что версия bundlor использует более старую версию ASM, которая не понимает файлы классов Java 8. Таким образом, вам нужно либо получить обновление для пакета или изменить использование другого инструмента. bnd был обновлен для поддержки файлов классов Java 8.

+0

Можете ли вы рассказать мне, как использовать новую версию ASM? Я не уверен, как указать версию, которую использует плагин. – mrcool

+0

Хорошо, я попытался поднять версию, но это не сработало. – mrcool

+0

Я не думаю, что вы можете сделать это извне. Разработчикам-разработчикам потребуется обновить его, чтобы использовать более позднюю версию ASM. Или вам нужно будет развить его и внести изменения самостоятельно. –

Смежные вопросы