Hi Michael, > gives me a self contained runnable jar. Progress! I’m learning. > > BUT as before when I run the jar, I get the Exception: No compatible > service: org.scijava.service.SciJavaService
Self contained runnable JARs (i.e., uber-jars) are convenient in some ways, but come with a host of problems. 1) If you do not shade your dependencies (i.e., rename their packages), then you may ship duplicate and/or incompatible classes with other libraries. This makes your library much harder to reuse in a shared system such as an ImageJ installation. 2) You cannot ship piecemeal updates to individual dependencies -- i.e., every time your code changes, you must ship a new (possibly very large) new JAR file to your users. 3) The SciJava annotation processor, responsible for indexing the @Plugin annotations that drive SciJava/ImageJ2/etc. plugins, writes the metadata into a resource file at META-INF/json/org.scijava.plugin.Plugin within the JAR. If you try to create an uber-jar via the assembly or shade plugin, the default combination algorithm will overwrite those files, stomping the annotations. We wrote some code which offers one way around this: https://github.com/imagej/imagej/blob/imagej-2.0.0-rc-17/pom.xml#L614-L631 For more on uber-jars, see also: http://imagej.net/Frequently_Asked_Questions#How_can_I_call_ImageJ_from_my_software.3F The gist is: avoid using an uber-jar unless you really need it. > I’ve got it working with your help! Awesome, congratulations. Let us know if you encounter any more roadblocks. Regards, Curtis On Fri, Dec 5, 2014 at 12:03 PM, Michael Ellis <michael.el...@dsuk.biz> wrote: > Adding a build section to the POM: > > <build> > <plugins> > <plugin> > <groupId>org.apache.maven.plugins</groupId> > <artifactId>maven-shade-plugin</artifactId> > <version>2.3</version> > <executions> > <execution> > <phase>package</phase> > <goals> > <goal>shade</goal> > </goals> > <configuration> > <transformers> > <transformer > implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> > <manifestEntries> > <Main-Class>com.mycompany.app.App</Main-Class> > <Build-Number>123</Build-Number> > </manifestEntries> > </transformer> > </transformers> > </configuration> > </execution> > </executions> > </plugin> > </plugins> > </build> > > To the POM gives me a self contained runnable jar. Progress! I’m learning. > > BUT as before when I run the jar, I get the Exception: No compatible > service: org.scijava.service.SciJavaService > ================================================================= > > [Michaels-Retina:~/temp/deleteme/my-app] michaelellis% java -jar > target/my-app-1.0-SNAPSHOT.jar > Hello World! > Exception: No compatible service: org.scijava.service.SciJavaService > ================================================================= > > Still vexed! > > > On 5 Dec 2014, at 17:17, Curtis Rueden <ctrue...@wisc.edu> wrote: > > Hi Michael, > > > mvn claims to build everything OK > > Yep, it did build successfully. > > > % java -cp target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App > > Error: A JNI error has occurred, please check your installation and try > again > > Exception in thread "main" java.lang.NoClassDefFoundError: io/scif/SCIFIO > > Maven is primarily a build tool. It puts the correct JARs on your > classpath at compile time. In your case, that is scifio-0.17.1.jar and its > dependencies. > > However, the way you are launching your program is not putting the > required dependencies on the classpath. You put only > my-app-1.0-SNAPSHOT.jar on the classpath, and its dependencies are missing. > So of course Java cannot find the needed classes. > > The gist is: it is your responsibility to assemble the dependencies and > ensure they are on the classpath somehow when you launch your application. > > There are several ways to accomplish this. Here is one generally useful > way using Maven, which does not assume you are doing anything > ImageJ-related: > > $ mvn dependency:copy-dependencies > $ java -cp 'target/my-app-1.0-SNAPSHOT.jar:target/dependency/*' > com.mycompany.app.App > > The "copy-dependencies" goal copies all the JAR files needed by your > program into the target/dependency folder, for easy subsequent consumption. > > Alternately, the "ImageJ way" of dealing with deployment is to ship all > needed dependencies in the "jars" folder of your ImageJ application. We > created a Maven goal for this too, which you can use as follows: > > $ mvn -Dimagej.app.directory=/Applications/ImageJ.app > -Ddelete.other.versions=true > > Which will copy your JAR and its dependencies into your ImageJ > installation at /Applications/ImageJ.app. But note that in order for this > goal to work, you must extend the pom-imagej parent (see > https://github.com/imagej/minimal-ij1-plugin for an example). > > A third solution is to use the exec-maven-plugin to launch your > application directly using Maven. E.g.: > https://github.com/imagej/imagej/blob/imagej-2.0.0-rc-17/pom.xml#L255-L278 > > Regards, > Curtis > > On Fri, Dec 5, 2014 at 11:03 AM, Michael Ellis <michael.el...@dsuk.biz> > wrote: > >> Curtis, >> >> Thanks but it is still not working. >> >> I have cut out using NetBeans and am now just using the CLI and a text >> editor. >> >> POM as follows: >> >> ======================================================== >> <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>com.mycompany.app</groupId> >> <artifactId>my-app</artifactId> >> <version>1.0-SNAPSHOT</version> >> <packaging>jar</packaging> >> >> <name>my-app</name> >> <url>http://maven.apache.org</url> >> >> <properties> >> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> >> </properties> >> >> <repositories> >> <repository> >> <id>imagej.public</id> >> <url>http://maven.imagej.net/content/groups/public</url> >> </repository> >> </repositories> >> >> <dependencies> >> <dependency> >> <groupId>junit</groupId> >> <artifactId>junit</artifactId> >> <version>3.8.1</version> >> <scope>test</scope> >> </dependency> >> >> <dependency> >> <groupId>io.scif</groupId> >> <artifactId>scifio</artifactId> >> <version>0.17.1</version> >> </dependency> >> >> </dependencies> >> </project> >> ======================================================== >> >> File hierarchy: >> >> . >> ./.DS_Store >> ./pom.xml >> ./src >> ./src/main >> ./src/main/java >> ./src/main/java/com >> ./src/main/java/com/mycompany >> ./src/main/java/com/mycompany/app >> ./src/main/java/com/mycompany/app/App.java >> ./src/test >> ./src/test/java >> ./src/test/java/com >> ./src/test/java/com/mycompany >> ./src/test/java/com/mycompany/app >> ./src/test/java/com/mycompany/app/AppTest.java >> ======================================================== >> >> App.java as follows: >> >> package com.mycompany.app; >> >> import io.scif.FormatException; >> import io.scif.ImageMetadata; >> import io.scif.Plane; >> import io.scif.Reader; >> import io.scif.SCIFIO; >> >> public class App >> { >> public static void main( String[] args ) >> { >> try { >> System.out.println( "Hello World!" ); >> SCIFIO scifio = new SCIFIO(); >> String sampleImage >> = >> "8bit-signed&pixelType=int8&lengths=50,50,3,5,7&axes=X,Y,Z,Channel,Time.fake"; >> final Reader reader = scifio.initializer().initializeReader(sampleImage); >> System.out.printf("reader=%s%n", reader ); >> } catch (Exception e) { >> System.out.printf("Exception: %s%n", e.getMessage() ); >> } >> } >> } >> >> ======================================================== >> >> mvm -U install >> >> [Michaels-Retina:~/temp/deleteme/my-app] michaelellis% mvn -U install >> [INFO] Scanning for projects... >> [INFO] >> >> [INFO] >> ------------------------------------------------------------------------ >> [INFO] Building my-app 1.0-SNAPSHOT >> [INFO] >> ------------------------------------------------------------------------ >> [INFO] >> [INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ >> my-app --- >> [INFO] Using 'UTF-8' encoding to copy filtered resources. >> [INFO] skip non existing resourceDirectory >> /Users/michaelellis/temp/deleteme/my-app/src/main/resources >> [INFO] >> [INFO] --- maven-compiler-plugin:3.1:compile (default-compile) @ my-app >> --- >> [INFO] Changes detected - recompiling the module! >> [INFO] Compiling 1 source file to >> /Users/michaelellis/temp/deleteme/my-app/target/classes >> [INFO] >> [INFO] --- maven-resources-plugin:2.6:testResources >> (default-testResources) @ my-app --- >> [INFO] Using 'UTF-8' encoding to copy filtered resources. >> [INFO] skip non existing resourceDirectory >> /Users/michaelellis/temp/deleteme/my-app/src/test/resources >> [INFO] >> [INFO] --- maven-compiler-plugin:3.1:testCompile (default-testCompile) @ >> my-app --- >> [INFO] Changes detected - recompiling the module! >> [INFO] Compiling 1 source file to >> /Users/michaelellis/temp/deleteme/my-app/target/test-classes >> [INFO] >> [INFO] --- maven-surefire-plugin:2.12.4:test (default-test) @ my-app --- >> [INFO] Surefire report directory: >> /Users/michaelellis/temp/deleteme/my-app/target/surefire-reports >> >> ------------------------------------------------------- >> T E S T S >> ------------------------------------------------------- >> Running com.mycompany.app.AppTest >> Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.005 sec >> >> Results : >> >> Tests run: 1, Failures: 0, Errors: 0, Skipped: 0 >> >> [INFO] >> [INFO] --- maven-jar-plugin:2.4:jar (default-jar) @ my-app --- >> [INFO] Building jar: >> /Users/michaelellis/temp/deleteme/my-app/target/my-app-1.0-SNAPSHOT.jar >> [INFO] >> [INFO] --- maven-install-plugin:2.4:install (default-install) @ my-app --- >> [INFO] Installing >> /Users/michaelellis/temp/deleteme/my-app/target/my-app-1.0-SNAPSHOT.jar to >> /Users/michaelellis/.m2/repository/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.jar >> [INFO] Installing /Users/michaelellis/temp/deleteme/my-app/pom.xml to >> /Users/michaelellis/.m2/repository/com/mycompany/app/my-app/1.0-SNAPSHOT/my-app-1.0-SNAPSHOT.pom >> [INFO] >> ------------------------------------------------------------------------ >> [INFO] BUILD SUCCESS >> [INFO] >> ------------------------------------------------------------------------ >> [INFO] Total time: 1.962 s >> [INFO] Finished at: 2014-12-05T16:59:50+00:00 >> [INFO] Final Memory: 18M/242M >> [INFO] ———————————————————————————————————— >> >> ======================================================== >> >> mvn claims to build everything OK there seems to be no inclusion of any >> scif libraries or class files. >> >> >> When I run it I get: >> >> [Michaels-Retina:~/temp/deleteme/my-app] michaelellis% java -cp >> target/my-app-1.0-SNAPSHOT.jar com.mycompany.app.App >> Error: A JNI error has occurred, please check your installation and try >> again >> Exception in thread "main" java.lang.NoClassDefFoundError: io/scif/SCIFIO >> at java.lang.Class.getDeclaredMethods0(Native Method) >> at java.lang.Class.privateGetDeclaredMethods(Class.java:2699) >> at java.lang.Class.privateGetMethodRecursive(Class.java:3046) >> at java.lang.Class.getMethod0(Class.java:3016) >> at java.lang.Class.getMethod(Class.java:1782) >> at sun.launcher.LauncherHelper.validateMainClass(LauncherHelper.java:544) >> at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:526) >> Caused by: java.lang.ClassNotFoundException: io.scif.SCIFIO >> at java.net.URLClassLoader.findClass(URLClassLoader.java:381) >> at java.lang.ClassLoader.loadClass(ClassLoader.java:424) >> at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) >> at java.lang.ClassLoader.loadClass(ClassLoader.java:357) >> ... 7 more >> >> >> ======================================================== >> >> I’ve been banging my head against this for two days now. >> >> So any help appreciated >> >> >> On 5 Dec 2014, at 16:35, Curtis Rueden <ctrue...@wisc.edu> wrote: >> >> Hi Michael, >> >> > The POM for io.scif:scifio:jar:0.17.1 is missing, no dependency >> > information available >> >> Make sure you have the following <repositories> block in your POM: >> >> <repositories> >> <repository> >> <id>imagej.public</id> >> <url>http://maven.imagej.net/content/groups/public</url> >> </repository> >> </repositories> >> >> Then rebuild with the "-U" flag. I don't know how to do this from >> NetBeans, but you only need to do it once from the CLI -- then you can >> return to NetBeans and it should work. >> >> Regards, >> Curtis >> >> On Fri, Dec 5, 2014 at 6:07 AM, Michael Ellis <michael.el...@dsuk.biz> >> wrote: >> >>> I have followed the advice offered by Curtis regarding adding >>> the io.scif: scifio dependency to my POM >>> >>> The dependency part of my POM looks like this: >>> >>> <dependencies> >>> <dependency> >>> <groupId>net.imglib2</groupId> >>> <artifactId>imglib2</artifactId> >>> <version>2.2.1-SNAPSHOT</version> >>> <type>jar</type> >>> </dependency> >>> <dependency> >>> <groupId>io.scif</groupId> >>> <artifactId>scifio</artifactId> >>> <version>0.17.1</version> >>> <type>jar</type> >>> </dependency> >>> </dependencies> >>> >>> I am using NetBeans IDE, configured for use with maven project (I am slo >>> using Java 8 and JavaFX) >>> >>> However when I attempt to Build (or Build with Dependencies) within >>> NetBeans, I get the following error message: >>> ============================================================ >>> >>> cd /Users/michaelellis/Documents/Development/MavenImgLib2FX; >>> JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_40.jdk/Contents/Home >>> "/Applications/NetBeans/NetBeans >>> 8.0.app/Contents/Resources/NetBeans/java/maven/bin/mvn" install >>> Scanning for projects... >>> >>> ------------------------------------------------------------------------ >>> Building MavenImgLib2FX 1.0-SNAPSHOT >>> ------------------------------------------------------------------------ >>> The POM for io.scif:scifio:jar:0.17.1 is missing, no dependency >>> information available >>> ------------------------------------------------------------------------ >>> BUILD FAILURE >>> ------------------------------------------------------------------------ >>> Total time: 0.341s >>> Finished at: Fri Dec 05 10:34:41 GMT 2014 >>> Final Memory: 7M/245M >>> ------------------------------------------------------------------------ >>> Failed to execute goal on project MavenImgLib2FX: Could not resolve >>> dependencies for project biz.dsuk:MavenImgLib2FX:jar:1.0-SNAPSHOT: Failure >>> to find io.scif:scifio:jar:0.17.1 in http://repo.maven.apache.org/maven2 >>> was cached in the local repository, resolution will not be reattempted >>> until the update interval of central has elapsed or updates are forced -> >>> [Help 1] >>> >>> To see the full stack trace of the errors, re-run Maven with the -e >>> switch. >>> Re-run Maven using the -X switch to enable full debug logging. >>> >>> For more information about the errors and possible solutions, please >>> read the following articles: >>> [Help 1] >>> http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException >>> >>> ============================================================ >>> >>> If I open a terminal window and cd into the project directory and: >>> >>> mvn clean package >>> >>> It succeeds. >>> >>> However, when I then attempt to run the project with: >>> >>> java -cp MavenImgLib2FX-1.0-SNAPSHOT.jar biz.dsuk.mavenimglib2fx.MainApp >>> >>> The application starts to execute but throws “No compatible service: >>> io.scif.SCIFIOService” exception. >>> ============================================================ >>> >>> img1=CellImg [20x30] >>> BufferedImage=BufferedImage@3137c585: type = 10 ColorModel: #pixelBits >>> = 8 numComponents = 1 color space = java.awt.color.ICC_ColorSpace@134d9d5f >>> transparency = 1 has alpha = false isAlphaPre = false >>> ByteInterleavedRaster: width = 707 height = 699 #numDataElements 1 >>> dataOff[0] = 0 >>> Loading image... >>> Exception in Application start method >>> java.lang.reflect.InvocationTargetException >>> 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:497) >>> at >>> com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:363) >>> at >>> com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:303) >>> 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:497) >>> at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) >>> Caused by: java.lang.RuntimeException: Exception in Application start >>> method >>> at >>> com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:875) >>> at >>> com.sun.javafx.application.LauncherImpl.lambda$launchApplication$150(LauncherImpl.java:157) >>> at >>> com.sun.javafx.application.LauncherImpl$$Lambda$50/553264065.run(Unknown >>> Source) >>> at java.lang.Thread.run(Thread.java:745) >>> Caused by: java.lang.IllegalArgumentException: No compatible service: >>> io.scif.SCIFIOService >>> at org.scijava.service.ServiceHelper.loadService(ServiceHelper.java:243) >>> at org.scijava.service.ServiceHelper.loadService(ServiceHelper.java:194) >>> at org.scijava.service.ServiceHelper.loadServices(ServiceHelper.java:170) >>> at org.scijava.Context.<init>(Context.java:244) >>> at org.scijava.Context.<init>(Context.java:203) >>> at org.scijava.Context.<init>(Context.java:142) >>> at org.scijava.Context.<init>(Context.java:128) >>> at io.scif.SCIFIO.<init>(SCIFIO.java:81) >>> at biz.dsuk.mavenimglib2fx.MainApp.start(MainApp.java:38) >>> at >>> com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$156(LauncherImpl.java:821) >>> at >>> com.sun.javafx.application.LauncherImpl$$Lambda$53/681110827.run(Unknown >>> Source) >>> at >>> com.sun.javafx.application.PlatformImpl.lambda$runAndWait$169(PlatformImpl.java:326) >>> at >>> com.sun.javafx.application.PlatformImpl$$Lambda$47/693632176.run(Unknown >>> Source) >>> at >>> com.sun.javafx.application.PlatformImpl.lambda$null$167(PlatformImpl.java:295) >>> at >>> com.sun.javafx.application.PlatformImpl$$Lambda$49/1260282780.run(Unknown >>> Source) >>> at java.security.AccessController.doPrivileged(Native Method) >>> at >>> com.sun.javafx.application.PlatformImpl.lambda$runLater$168(PlatformImpl.java:294) >>> at >>> com.sun.javafx.application.PlatformImpl$$Lambda$48/1364335809.run(Unknown >>> Source) >>> at >>> com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) >>> Exception running application biz.dsuk.mavenimglib2fx.MainApp >>> ============================================================ >>> >>> If I remove the calls to the SCIO code and build and run from the >>> command line, all works well. >>> >>> The SCIO source code that I am using is lifted/amended from one of the >>> tutorials and is as follows: >>> >>> ============================================================ >>> imagePath = >>> "8bit-signed&pixelType=int8&lengths=50,50,3,5,7&axes=X,Y,Z,Channel,Time.fake"; >>> System.out.println("Loading image... '" + imagePath + "'"); >>> SCIFIO scifio = new SCIFIO(); >>> final Reader reader = >>> scifio.initializer().initializeReader(imagePath); >>> ============================================================ >>> >>> This source code works file in the SCIFIO tutorial. >>> >>> Any help gratefully appreciated!!!!! >>> >>> — Michael Ellis >>> >>> >>> >>> >>> On 3 Dec 2014, at 19:31, Curtis Rueden <ctrue...@wisc.edu> wrote: >>> >>> Hi Michael, >>> >>> > How do I establish what Maven projects I need to include? >>> >>> One way to check is using the dependency-maven-plugin like so: >>> >>> mvn dependency:analyze >>> >>> This will tell you: >>> >>> A) Dependencies you declared but do not actually use; and >>> B) Dependencies you did not declare directly, but actually need. >>> >>> Note that this will only work if your project compiles successfully. In >>> other words, it is easier to start with "too many" dependencies and pare >>> down, rather than trying to "build up" from zero. >>> >>> So in your case, you can start with the ImgLib2 Examples dependencies >>> block, run dependency:analyze, and adjust the POM according to its >>> recommendations. >>> >>> > When I go to my NetBeans project dependence, select Add dependency, >>> > then type SCIF to the query text box, I get a huge list of >>> > possibilities. >>> >>> The dependency you probably want is io.scif:scifio (i.e.: a groupId of >>> io.scif, and an artifactId of scifio). Presumably at the latest version. >>> You can search for that here: >>> >>> http://maven.imagej.net/index.html#nexus-search;gav~io.scif~scifio~~~ >>> >>> So your dependency block in this case would be: >>> >>> <dependency> >>> <groupId>io.scif</groupId> >>> <artifactId>scifio</artifactId> >>> <version>0.17.1</version> >>> </dependency> >>> >>> Note that that block of XML is available for copy-pasting from the link >>> above. >>> >>> > I am completely new to maven >>> >>> For more information, see: >>> http://imagej.net/Maven >>> >>> Regards, >>> Curtis >>> >>> On Tue, Dec 2, 2014 at 6:05 PM, Michael Ellis <michael.el...@dsuk.biz> >>> wrote: >>> >>>> I am investigating the using ImgLib2 for a project. >>>> >>>> I am using NetBeans and have managed to create a NetBeans Mavern >>>> project and have added a dependency for ImgLib2 Core Library and that >>>> seems to be working OK. >>>> >>>> I now want to add the least possible requirements for the purpose of >>>> opening some image files. >>>> >>>> How do I establish what Maven projects I need to include? >>>> >>>> I have cloned the ImgLib2 Examples project and got that working but >>>> that seems to include all manner of things that I suspect I do not need. >>>> >>>> When I go to my NetBeans project dependence, select Add dependency, >>>> then type SCIF to the query text box, I get a huge list of possibilities. >>>> >>>> I am completely new to maven and so do not know what I am doing with it! >>>> >>>> — Michael Ellis >>>> Digital Scientific UK Ltd. >>>> >>>> >>>> >>>> >>>> _______________________________________________ >>>> ImageJ-devel mailing list >>>> ImageJ-devel@imagej.net >>>> http://imagej.net/mailman/listinfo/imagej-devel >>>> >>>> >>> >>> >>> _______________________________________________ >>> ImageJ-devel mailing list >>> ImageJ-devel@imagej.net >>> http://imagej.net/mailman/listinfo/imagej-devel >>> >>> >> >> >> _______________________________________________ >> ImageJ-devel mailing list >> ImageJ-devel@imagej.net >> http://imagej.net/mailman/listinfo/imagej-devel >> >> > > > _______________________________________________ > ImageJ-devel mailing list > ImageJ-devel@imagej.net > http://imagej.net/mailman/listinfo/imagej-devel > >
_______________________________________________ ImageJ-devel mailing list ImageJ-devel@imagej.net http://imagej.net/mailman/listinfo/imagej-devel