You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@maven.apache.org by Dušan Rychnovský <ge...@gmail.com> on 2015/07/31 18:51:56 UTC

Automating the build of a JNI based application

Hi,

I'm creating a JNI wrapper on top of a C++ library. I'd like to have a
"one-click" Maven build for the whole application. When building it
manually, I need to do the following:

javac ... (compile the Java source files)
javah ... (generate JNI header files from Java class files)
g++   ... (compile the JNI source files + link them with the static library)

I'm looking for a way to have these commands executed by Maven.

I looked at the native-maven-plugin (
http://maven.apache.org/archives/maven-1.x/plugins/native/index.html) and
I'm afraid it will not work for me.

* The documentation is extremely insufficient (there is literally no
official documentation on the plugin site and nor is there any information
elsewhere on the Internet).

* I cannot even look at the source-code as it isn't there in the SVN
repository linked from the plugin site.

* I tried to make it work based on the two SO posts I discovered but I
couldn't.

I'm thinking about the following project layout:

/src
/src/main
/src/main/java    ... the Java interfaces with native methods
/src/main/native ... the C++ implementation of the generated header files

The static library itself is a product of a different project and will be
installed on my system in a standard location (i.e. outside of this
project).

What I need is essentially to call the javah and g++ commands after the
Java .class files have been generated. The g++ command is non-trivial,
there are quite a few compiler and linker options that need to be applied.
The generated library file should not be a part of the generated JAR file,
it should be a separate artifact.

I was thinking maybe I'll need to use the exec-maven-plugin (
http://www.mojohaus.org/exec-maven-plugin/index.html) and run the commands
manually? Or is there a better way to do this?

Also, once the library is generated, I'd like to have Maven run some test
cases using the generated JNI wrapper to make sure it works correctly.

Thanks very much for your help.

Kind regards,
Dusan

Re: Automating the build of a JNI based application

Posted by Karl Heinz Marbaise <kh...@gmx.de>.
Hi,

I would suggest to use Maven 3.X and not Maven 2.X anymore...but apart 
from that the site shows Maven minimum 2.0.9[2]...which looks like a bug...

Furthermore please be aware of EoL for Maven 2 [1].


[1] http://maven.apache.org/maven-2.x-eol.html
[2] http://maven-nar.github.io/plugin-info.html

On 8/3/15 9:01 AM, Dušan Rychnovský wrote:
> Hi,
>
> Thanks for your suggestions.
>
> I tried the nar-maven-plugin as described on the usage page (
> http://maven-nar.github.io/usage.html). I have the following pom:
>
> <?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/xsd/maven-4.0.0.xsd">
>
>    <modelVersion>4.0.0</modelVersion>
>
>    <groupId>cz....</groupId>
>    <artifactId>...</artifactId>
>    <version>1.0-SNAPSHOT</version>
>    <packaging>nar</packaging>
>
>    <build>
>      <plugins>
>        <plugin>
>          <artifactId>maven-compiler-plugin</artifactId>
>          <version>3.1</version>
>          <configuration>
>            <source>1.7</source>
>            <target>1.7</target>
>          </configuration>
>        </plugin>
>        <plugin>
>          <groupId>com.github.maven-nar</groupId>
>          <artifactId>nar-maven-plugin</artifactId>
>          <version>3.2.3</version>
>          <extensions>true</extensions>
>          <configuration>
>            <libraries>
>              <library>
>                <type>jni</type>
>                <narSystemPackage>cz....</narSystemPackage>
>              </library>
>            </libraries>
>          </configuration>
>        </plugin>
>      </plugins>
>    </build>
> </project>
>
>
> And the following maven version:
>
> *Apache Maven 2.2.1 (rdebian-4)*
>
> And when I run
>
> *mvn clean package*
>
> I get the following error
>
>
> *Internal error in the plugin manager executing goal
> 'com.github.maven-nar:nar-maven-plugin:3.2.3:nar-validate': Unable to load
> the mojo 'com.github.maven-nar:nar-maven-plugin:3.2.3:nar-validate' in the
> plugin 'com.github.maven-nar:nar-maven-plugin'. A required class is
> missing: org/sonatype/aether/resolution /ArtifactResolutionException
> org.sonatype.aether.resolution.ArtifactResolutionException*
> What's wrong?
>
> Thanks,
> Dusan
>
>
>
> 2015-08-01 21:05 GMT+02:00 Benson Margulies <bi...@gmail.com>:
>
>> Look for the modern nar plugin on github.
>>
>> On Fri, Jul 31, 2015 at 12:59 PM, Karl Heinz Marbaise <kh...@gmx.de>
>> wrote:
>>> Hi,
>>>
>>> On 7/31/15 6:51 PM, Dušan Rychnovský wrote:
>>>>
>>>> Hi,
>>>>
>>>> I'm creating a JNI wrapper on top of a C++ library. I'd like to have a
>>>> "one-click" Maven build for the whole application. When building it
>>>> manually, I need to do the following:
>>>>
>>>> javac ... (compile the Java source files)
>>>> javah ... (generate JNI header files from Java class files)
>>>> g++   ... (compile the JNI source files + link them with the static
>>>> library)
>>>>
>>>> I'm looking for a way to have these commands executed by Maven.
>>>>
>>>> I looked at the native-maven-plugin (
>>>> http://maven.apache.org/archives/maven-1.x/plugins/native/index.html)
>> and
>>>> I'm afraid it will not work for me.
>>>
>>>
>>> Nor should it cause Maven 1 is simply dead..
>>>
>>>
>>>>
>>>> * The documentation is extremely insufficient (there is literally no
>>>> official documentation on the plugin site and nor is there any
>> information
>>>> elsewhere on the Internet).
>>>
>>>
>>> which is not really astonishing...
>>>
>>>
>>>>
>>>> * I cannot even look at the source-code as it isn't there in the SVN
>>>> repository linked from the plugin site.
>>>>
>>>> * I tried to make it work based on the two SO posts I discovered but I
>>>> couldn't.
>>>>
>>>> I'm thinking about the following project layout:
>>>>
>>>> /src
>>>> /src/main
>>>> /src/main/java    ... the Java interfaces with native methods
>>>> /src/main/native ... the C++ implementation of the generated header
>> files
>>>>
>>>> The static library itself is a product of a different project and will
>> be
>>>> installed on my system in a standard location (i.e. outside of this
>>>> project).
>>>>
>>>> What I need is essentially to call the javah and g++ commands after the
>>>> Java .class files have been generated. The g++ command is non-trivial,
>>>> there are quite a few compiler and linker options that need to be
>> applied.
>>>> The generated library file should not be a part of the generated JAR
>> file,
>>>> it should be a separate artifact.
>>>>
>>>> I was thinking maybe I'll need to use the exec-maven-plugin (
>>>> http://www.mojohaus.org/exec-maven-plugin/index.html) and run the
>> commands
>>>> manually? Or is there a better way to do this?
>>>>
>>>> Also, once the library is generated, I'd like to have Maven run some
>> test
>>>> cases using the generated JNI wrapper to make sure it works correctly.
>>>>
>>>> Thanks very much for your help.
>>>>
>>>> Kind regards,
>>>> Dusan
>>>>
>>>
>>> I woudl suggest to take a look into the nar-maven-plugin:
>>>
>>> http://maven-nar.github.io/
>>>
>>> which might be better fit your needs..
>>>
>>> Kind Regards
>>> Karl Heinz Marbaise
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
>>> For additional commands, e-mail: users-help@maven.apache.org
>>>
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
>> For additional commands, e-mail: users-help@maven.apache.org
>>
>>
>


Mit freundlichem Gruß
Karl-Heinz Marbaise
-- 
SoftwareEntwicklung Beratung Schulung    Tel.: +49 (0) 2405 / 415 893
Dipl.Ing.(FH) Karl-Heinz Marbaise        USt.IdNr: DE191347579
Hauptstrasse 177
52146 Würselen                           http://www.soebes.de

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org


Re: Automating the build of a JNI based application

Posted by Dušan Rychnovský <ge...@gmail.com>.
Hi,

Thanks for your suggestions.

I tried the nar-maven-plugin as described on the usage page (
http://maven-nar.github.io/usage.html). I have the following pom:

<?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/xsd/maven-4.0.0.xsd">

  <modelVersion>4.0.0</modelVersion>

  <groupId>cz....</groupId>
  <artifactId>...</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>nar</packaging>

  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.7</source>
          <target>1.7</target>
        </configuration>
      </plugin>
      <plugin>
        <groupId>com.github.maven-nar</groupId>
        <artifactId>nar-maven-plugin</artifactId>
        <version>3.2.3</version>
        <extensions>true</extensions>
        <configuration>
          <libraries>
            <library>
              <type>jni</type>
              <narSystemPackage>cz....</narSystemPackage>
            </library>
          </libraries>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>


And the following maven version:

*Apache Maven 2.2.1 (rdebian-4)*

And when I run

*mvn clean package*

I get the following error


*Internal error in the plugin manager executing goal
'com.github.maven-nar:nar-maven-plugin:3.2.3:nar-validate': Unable to load
the mojo 'com.github.maven-nar:nar-maven-plugin:3.2.3:nar-validate' in the
plugin 'com.github.maven-nar:nar-maven-plugin'. A required class is
missing: org/sonatype/aether/resolution /ArtifactResolutionException
org.sonatype.aether.resolution.ArtifactResolutionException*
What's wrong?

Thanks,
Dusan



2015-08-01 21:05 GMT+02:00 Benson Margulies <bi...@gmail.com>:

> Look for the modern nar plugin on github.
>
> On Fri, Jul 31, 2015 at 12:59 PM, Karl Heinz Marbaise <kh...@gmx.de>
> wrote:
> > Hi,
> >
> > On 7/31/15 6:51 PM, Dušan Rychnovský wrote:
> >>
> >> Hi,
> >>
> >> I'm creating a JNI wrapper on top of a C++ library. I'd like to have a
> >> "one-click" Maven build for the whole application. When building it
> >> manually, I need to do the following:
> >>
> >> javac ... (compile the Java source files)
> >> javah ... (generate JNI header files from Java class files)
> >> g++   ... (compile the JNI source files + link them with the static
> >> library)
> >>
> >> I'm looking for a way to have these commands executed by Maven.
> >>
> >> I looked at the native-maven-plugin (
> >> http://maven.apache.org/archives/maven-1.x/plugins/native/index.html)
> and
> >> I'm afraid it will not work for me.
> >
> >
> > Nor should it cause Maven 1 is simply dead..
> >
> >
> >>
> >> * The documentation is extremely insufficient (there is literally no
> >> official documentation on the plugin site and nor is there any
> information
> >> elsewhere on the Internet).
> >
> >
> > which is not really astonishing...
> >
> >
> >>
> >> * I cannot even look at the source-code as it isn't there in the SVN
> >> repository linked from the plugin site.
> >>
> >> * I tried to make it work based on the two SO posts I discovered but I
> >> couldn't.
> >>
> >> I'm thinking about the following project layout:
> >>
> >> /src
> >> /src/main
> >> /src/main/java    ... the Java interfaces with native methods
> >> /src/main/native ... the C++ implementation of the generated header
> files
> >>
> >> The static library itself is a product of a different project and will
> be
> >> installed on my system in a standard location (i.e. outside of this
> >> project).
> >>
> >> What I need is essentially to call the javah and g++ commands after the
> >> Java .class files have been generated. The g++ command is non-trivial,
> >> there are quite a few compiler and linker options that need to be
> applied.
> >> The generated library file should not be a part of the generated JAR
> file,
> >> it should be a separate artifact.
> >>
> >> I was thinking maybe I'll need to use the exec-maven-plugin (
> >> http://www.mojohaus.org/exec-maven-plugin/index.html) and run the
> commands
> >> manually? Or is there a better way to do this?
> >>
> >> Also, once the library is generated, I'd like to have Maven run some
> test
> >> cases using the generated JNI wrapper to make sure it works correctly.
> >>
> >> Thanks very much for your help.
> >>
> >> Kind regards,
> >> Dusan
> >>
> >
> > I woudl suggest to take a look into the nar-maven-plugin:
> >
> > http://maven-nar.github.io/
> >
> > which might be better fit your needs..
> >
> > Kind Regards
> > Karl Heinz Marbaise
> >
> > ---------------------------------------------------------------------
> > To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
> > For additional commands, e-mail: users-help@maven.apache.org
> >
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
> For additional commands, e-mail: users-help@maven.apache.org
>
>

Re: Automating the build of a JNI based application

Posted by Benson Margulies <bi...@gmail.com>.
Look for the modern nar plugin on github.

On Fri, Jul 31, 2015 at 12:59 PM, Karl Heinz Marbaise <kh...@gmx.de> wrote:
> Hi,
>
> On 7/31/15 6:51 PM, Dušan Rychnovský wrote:
>>
>> Hi,
>>
>> I'm creating a JNI wrapper on top of a C++ library. I'd like to have a
>> "one-click" Maven build for the whole application. When building it
>> manually, I need to do the following:
>>
>> javac ... (compile the Java source files)
>> javah ... (generate JNI header files from Java class files)
>> g++   ... (compile the JNI source files + link them with the static
>> library)
>>
>> I'm looking for a way to have these commands executed by Maven.
>>
>> I looked at the native-maven-plugin (
>> http://maven.apache.org/archives/maven-1.x/plugins/native/index.html) and
>> I'm afraid it will not work for me.
>
>
> Nor should it cause Maven 1 is simply dead..
>
>
>>
>> * The documentation is extremely insufficient (there is literally no
>> official documentation on the plugin site and nor is there any information
>> elsewhere on the Internet).
>
>
> which is not really astonishing...
>
>
>>
>> * I cannot even look at the source-code as it isn't there in the SVN
>> repository linked from the plugin site.
>>
>> * I tried to make it work based on the two SO posts I discovered but I
>> couldn't.
>>
>> I'm thinking about the following project layout:
>>
>> /src
>> /src/main
>> /src/main/java    ... the Java interfaces with native methods
>> /src/main/native ... the C++ implementation of the generated header files
>>
>> The static library itself is a product of a different project and will be
>> installed on my system in a standard location (i.e. outside of this
>> project).
>>
>> What I need is essentially to call the javah and g++ commands after the
>> Java .class files have been generated. The g++ command is non-trivial,
>> there are quite a few compiler and linker options that need to be applied.
>> The generated library file should not be a part of the generated JAR file,
>> it should be a separate artifact.
>>
>> I was thinking maybe I'll need to use the exec-maven-plugin (
>> http://www.mojohaus.org/exec-maven-plugin/index.html) and run the commands
>> manually? Or is there a better way to do this?
>>
>> Also, once the library is generated, I'd like to have Maven run some test
>> cases using the generated JNI wrapper to make sure it works correctly.
>>
>> Thanks very much for your help.
>>
>> Kind regards,
>> Dusan
>>
>
> I woudl suggest to take a look into the nar-maven-plugin:
>
> http://maven-nar.github.io/
>
> which might be better fit your needs..
>
> Kind Regards
> Karl Heinz Marbaise
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
> For additional commands, e-mail: users-help@maven.apache.org
>

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org


Re: Automating the build of a JNI based application

Posted by Karl Heinz Marbaise <kh...@gmx.de>.
Hi,

On 7/31/15 6:51 PM, Dušan Rychnovský wrote:
> Hi,
>
> I'm creating a JNI wrapper on top of a C++ library. I'd like to have a
> "one-click" Maven build for the whole application. When building it
> manually, I need to do the following:
>
> javac ... (compile the Java source files)
> javah ... (generate JNI header files from Java class files)
> g++   ... (compile the JNI source files + link them with the static library)
>
> I'm looking for a way to have these commands executed by Maven.
>
> I looked at the native-maven-plugin (
> http://maven.apache.org/archives/maven-1.x/plugins/native/index.html) and
> I'm afraid it will not work for me.

Nor should it cause Maven 1 is simply dead..


>
> * The documentation is extremely insufficient (there is literally no
> official documentation on the plugin site and nor is there any information
> elsewhere on the Internet).

which is not really astonishing...

>
> * I cannot even look at the source-code as it isn't there in the SVN
> repository linked from the plugin site.
>
> * I tried to make it work based on the two SO posts I discovered but I
> couldn't.
>
> I'm thinking about the following project layout:
>
> /src
> /src/main
> /src/main/java    ... the Java interfaces with native methods
> /src/main/native ... the C++ implementation of the generated header files
>
> The static library itself is a product of a different project and will be
> installed on my system in a standard location (i.e. outside of this
> project).
>
> What I need is essentially to call the javah and g++ commands after the
> Java .class files have been generated. The g++ command is non-trivial,
> there are quite a few compiler and linker options that need to be applied.
> The generated library file should not be a part of the generated JAR file,
> it should be a separate artifact.
>
> I was thinking maybe I'll need to use the exec-maven-plugin (
> http://www.mojohaus.org/exec-maven-plugin/index.html) and run the commands
> manually? Or is there a better way to do this?
>
> Also, once the library is generated, I'd like to have Maven run some test
> cases using the generated JNI wrapper to make sure it works correctly.
>
> Thanks very much for your help.
>
> Kind regards,
> Dusan
>

I woudl suggest to take a look into the nar-maven-plugin:

http://maven-nar.github.io/

which might be better fit your needs..

Kind Regards
Karl Heinz Marbaise

---------------------------------------------------------------------
To unsubscribe, e-mail: users-unsubscribe@maven.apache.org
For additional commands, e-mail: users-help@maven.apache.org