10

I have a desktop (centos 7.1) and a ftp server (GF4 is here). And I want to copy files after maven building to ftp server (witch was mounted by nautilus) However I get this:

at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:217)
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:84)
at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
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 org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)
Caused by: org.apache.maven.plugin.MojoExecutionException: Error copying artifact from /home/myuser/temp/target/temp.jar to /run/user/1000/gvfs/ftp:host=X.X.X.X,port=XXX/glassfish4/glassfish/domains/domain3/autodeploy/bundles/temp.jar
    at org.apache.maven.plugin.dependency.AbstractDependencyMojo.copyFile(AbstractDependencyMojo.java:232)
    at org.apache.maven.plugin.dependency.fromConfiguration.CopyMojo.copyArtifact(CopyMojo.java:133)
    at org.apache.maven.plugin.dependency.fromConfiguration.CopyMojo.doExecute(CopyMojo.java:111)
    at org.apache.maven.plugin.dependency.AbstractDependencyMojo.execute(AbstractDependencyMojo.java:167)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    ... 19 more
Caused by: java.io.IOException: Illegal seek
    at sun.nio.ch.FileDispatcherImpl.pwrite0(Native Method)
    at sun.nio.ch.FileDispatcherImpl.pwrite(FileDispatcherImpl.java:66)
    at sun.nio.ch.IOUtil.writeFromNativeBuffer(IOUtil.java:89)
    at sun.nio.ch.IOUtil.write(IOUtil.java:51)
    at sun.nio.ch.FileChannelImpl.writeInternal(FileChannelImpl.java:745)
    at sun.nio.ch.FileChannelImpl.write(FileChannelImpl.java:731)
    at sun.nio.ch.FileChannelImpl.transferFromFileChannel(FileChannelImpl.java:603)
    at sun.nio.ch.FileChannelImpl.transferFrom(FileChannelImpl.java:675)
    at org.codehaus.plexus.util.FileUtils.doCopyFile(FileUtils.java:1077)
    at org.codehaus.plexus.util.FileUtils.copyFile(FileUtils.java:1049)
    at org.apache.maven.plugin.dependency.AbstractDependencyMojo.copyFile(AbstractDependencyMojo.java:228)
    ... 24 more

The file in folder /run/user/1000/gvfs/ftp:host=X.X.X.X,port=XXX/glassfish4/glassfish/domains/domain3/autodeploy/bundles/temp.jar is created but its size=0. Besides when I do manual copy:

cp /home/myuser/temp/target/temp.jar /run/user/1000/gvfs/ftp:host=X.X.X.X,port=XXX/glassfish4/glassfish/domains/domain3/autodeploy/bundles/

every thing is ok. How to fix it?
EDIT1
I created an empty osgi project which contains only activator. Here is the pom

<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</groupId>
    <artifactId>hworld</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>bundle</packaging>

    <name>hworld</name>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.osgi</groupId>
            <artifactId>org.osgi.core</artifactId>
            <version>4.3.0</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.3.7</version>
                <extensions>true</extensions>
                <configuration>
                    <instructions>
                        <Bundle-Activator>com.mycompany.hworld.Activator</Bundle-Activator>
                        <Export-Package/>
                    </instructions>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>2.8</version>
                <executions>
                  <execution>
                    <id>copy</id>
                    <phase>package</phase>
                    <goals>
                      <goal>copy</goal>
                    </goals>
                    <configuration>
                      <artifactItems>
                        <artifactItem>
                          <groupId>${project.groupId}</groupId>
                          <artifactId>${project.artifactId}</artifactId>
                          <version>${project.version}</version>
                          <type>${project.packaging}</type>
                          <outputDirectory>HERE IS FOLDER NAME</outputDirectory>
                        </artifactItem>
                      </artifactItems>
                    </configuration>
                  </execution>
                </executions>
              </plugin>            
        </plugins>
    </build>

    <profiles>
        <profile>
            <id>build-for-felix</id>
            <dependencies>
                <dependency>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>org.apache.felix.main</artifactId>
                    <version>4.0.3</version>
                    <scope>provided</scope>
                </dependency>
                 </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <version>1.7</version>
                        <executions>
                            <execution>
                                <id>compile</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>run</goal>
                                </goals>
                                <configuration>
                                    <target>
                                        <pathconvert property="plugins.jars" pathsep="${path.separator}">
                                            <path refid="maven.runtime.classpath"/>
                                            <map from="${project.build.directory}${file.separator}classes" to=""/>
                                        </pathconvert>
                                        <pathconvert pathsep=" " property="bundles">
                                            <path path="${plugins.jars}"/>
                                            <mapper>
                                                <chainedmapper>
                                                    <flattenmapper/>
                                                    <globmapper from="*" to="file:modules/*" casesensitive="no"/>
                                                </chainedmapper>
                                            </mapper>
                                        </pathconvert>
                                        <propertyfile file="${project.build.directory}/config.properties">
                                            <entry key="felix.auto.start" value="${bundles} file:modules/${project.build.finalName}.jar"/>
                                            <entry key="org.osgi.framework.bootdelegation" value="*"/>
                                        </propertyfile>
                                        <copy file="${maven.dependency.org.apache.felix.org.apache.felix.main.jar.path}" tofile="${project.build.directory}/felix.jar"/>
                                    </target>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-assembly-plugin</artifactId>
                        <version>2.3</version>
                        <executions>
                            <execution>
                                <id>create-executable-jar</id>
                                <phase>package</phase>
                                <goals>
                                    <goal>single</goal>
                                </goals>
                                <configuration>
                                    <descriptors>
                                        <descriptor>${basedir}/src/main/assembly/felix.xml</descriptor>
                                    </descriptors>
                                    <finalName>${project.build.finalName}</finalName>
                                </configuration>
                            </execution>
                        </executions>
                    </plugin>
                </plugins>
            </build>
        </profile>
        <profile>
            <id>run-on-felix</id>
            <dependencies>
                <dependency>
                    <groupId>org.apache.felix</groupId>
                    <artifactId>org.apache.felix.main</artifactId>
                    <version>4.0.3</version>
                    <scope>provided</scope>
                </dependency>
                <!-- org.apache.felix:org.apache.felix.gogo.shell:0.6.1 useless from Maven since stdin is swallowed -->
            </dependencies>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-antrun-plugin</artifactId>
                        <version>1.7</version>
                        <configuration>
                            <target>
                                <property name="vm.args" value=""/>
                                <pathconvert property="plugins.jars" pathsep="${path.separator}">
                                    <path refid="maven.runtime.classpath"/>
                                    <map from="${project.build.directory}${file.separator}classes" to=""/>
                                </pathconvert>
                                <makeurl property="urls" separator=" ">
                                    <path path="${plugins.jars}"/>
                                    <path location="${project.build.directory}/${project.build.finalName}.jar"/>
                                </makeurl>
                                <propertyfile file="${project.build.directory}/run.properties">
                                    <entry key="felix.auto.start" value="${urls}"/>
                                    <entry key="felix.auto.deploy.action" value="uninstall,install,update,start"/>
                                    <entry key="org.osgi.framework.storage" value="${project.build.directory}${file.separator}felix-cache"/>
                                    <entry key="org.osgi.framework.bootdelegation" value="*"/>
                                </propertyfile>
                                <makeurl property="run.properties.url" file="${project.build.directory}/run.properties"/>
                                <java fork="true" jar="${maven.dependency.org.apache.felix.org.apache.felix.main.jar.path}">
                                    <sysproperty key="felix.config.properties" value="${run.properties.url}"/>
                                    <jvmarg line="${vm.args}"/>
                                </java>
                            </target>
                        </configuration>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
</project>

Result is the same - at destination folder hworld-1.0.-SNAPSHOT.jar is created but its size=0.

  • Can you create a small test that only copies a dummy jar to your server? – higuaro May 08 '15 at 13:54
  • @higuaro I don't understand you. What do you mean a small test? –  May 08 '15 at 14:38
  • Just a simple "hello world" project built by maven that mimics the steps of the failing project. The idea of this toy project is to reproduce the problem and focus on the failing part of it – higuaro May 08 '15 at 14:41
  • Have you tried playing with FUSE mount options? E.g. `direct_io`, `auto_cache` or `kernel_cache`. Here is some info: http://sourceforge.net/p/fuse/fuse/ci/master/tree/ – VolenD May 08 '15 at 17:06
  • Can you try updating your configuration to copy to another location on the client? This is to rule out issues with the FTP server and FUSE mount, and instead to ensure that the maven project can access the data of the file you are trying to copy. – Phil May 11 '15 at 17:32
  • @Phil when I change location to copy to local folder (not ftp) everything works ok. The problem is somewhere betwenn ftp, fuse and java. Why java - because when I copy the jar to ftp server via `cp` everything works. I wrote about in question. –  May 11 '15 at 20:21
  • Similar issue with file copy on gvfs ftp : https://github.com/joyent/node/issues/6877 . plexus-utils-3.0.21 uses another system to copy files with Java7+ maybe it will fix the issue. Another option is to use an ant task: http://stackoverflow.com/questions/1405979/using-maven-for-deployment – nomoa May 15 '15 at 11:10

1 Answers1

1

Using maven-dependency-plugin's copy target you can copy the dependencies available to the plugin at the time of running it, which is before the binary artefacts of your project are available in target folder.

To upload the binary artefacts of your project to FTP, please use the following:

  • in your pom:
<project>
  ...
  <distributionManagement>
    <repository>
      <id>ftp-repository</id>
      <url>ftp://repository.mycompany.com/repository</url>
    </repository>
  </distributionManagement>

  <build>
    <extensions>
      <!-- Enabling the use of FTP -->
      <extension>
        <groupId>org.apache.maven.wagon</groupId>
         <artifactId>wagon-ftp</artifactId>
         <version>2.9</version>
      </extension>
    </extensions>
  </build>
  ...
</project>
  • in your ~.m2/settings.xml
<settings>
  ...
  <servers>
    <server>
      <id>ftp-repository</id>
      <username>user</username>
      <password>pass</password>
    </server>
  </servers>
  ...
</settings>

Please note that id from pom matches the id in settings.

diginoise
  • 7,352
  • 2
  • 31
  • 39
  • Upvote because it's another way to upload files, but not solution to my problem. –  May 13 '15 at 08:11
  • The solution you provided doesn't help at all as it copies files according to maven repo url principles. –  May 13 '15 at 10:13
  • @iJava the other possible option is to use maven ant plugin: http://stackoverflow.com/questions/3935433/upload-file-via-ant-ftp-task-in-maven – diginoise May 15 '15 at 13:50