2013-07-15 272 views
1

所以我有一个基本的Java程序,我试图用Ant的rpm任务打包为RPM。我通过Cygwin运行它。我的问题是当我运行ant build脚本时,它似乎试图使用rpm命令而不是所需的rpmbuild命令。从我读过的内容来看,ant rpm任务应该使用rpmbuild,除非找不到,在这种情况下,它将使用rpm。我知道一个事实都安装正确,因为我可以使用命令行手动创建RPM就好了。我不确定是否需要在构建脚本或spec文件中更改某些内容才能使其发挥作用,因为我对这类事情很陌生。或者如果这是Cygwin依赖性问题?在Cygwin上使用Ant创建RPM

证明转和的rpmbuild的安装Cygwin中:

$ which rpm 
/usr/bin/rpm 

$ which rpmbuild 
/usr/bin/rpmbuild 

这里是我的build.xml文件:

<project name="SimpleJavaApp" default="all"> 

<property name="src"  value="${basedir}/src" /> 
<property name="output"  value="${basedir}/output" /> 
<property name="classes" value="${output}/classes" /> 
<property name="jars"  value="${output}/jars" /> 
<property name="build.dir" value="${basedir}/build"/> 

<target name="clean"> 
    <delete dir="${output}" /> 
</target> 

<target name="compile"> 
    <mkdir dir="${classes}" /> 
    <javac srcdir="${src}" destdir="${classes}" /> 
</target> 

<target name="jar"> 
    <mkdir dir="${jars}" /> 
    <jar basedir="${classes}" destfile="${jars}/app.jar"> 
     <manifest> 
       <attribute name="Main-Class" value="Main"/> 
     </manifest> 
    </jar> 
</target> 

<!-- Create directories --> 
<mkdir dir="${build.dir}/BUILD"/> 
<mkdir dir="${build.dir}/SOURCES"/> 
<mkdir dir="${build.dir}/RPMS/noarch"/> 
<mkdir dir="${build.dir}/SPECS"/> 

<!-- copy spec files --> 
<copy todir="${build.dir}/SPECS" preservelastmodified="true" failonerror="true"> 
    <fileset dir="${basedir}" includes="*.spec"/> 
</copy> 

<target name="rpm" description="Compile single binary rpm by spec file"> 
    <rpm 
     specFile="project.spec" 
     topDir="build" 
     cleanBuildDir="false" 
     removeSpec="false" 
     removeSource="false" 
     command = "ba" 
     failOnError="false" 
    /> 
</target> 


<target name="all" depends="clean, compile, jar, rpm" /> 

这里是我的spec文件,prett Ÿ简单:

Summary: An RPM Spec example 
Name:  Application-Example 
Version: 1.0 
Release: 1 
Group: Applications/Sample 
URL:  http://www.mycompany.com 
Packager: Name <[email protected]> 
BuildArch: noarch 

%description 
This is a sample SPEC file for the RPM project 
demonstrating how to build, package, install(deploy) 

%files 

最后,这里是Ant构建的输出(只转一部分):

rpm: 
    [rpm] Building the RPM based on the project.spec file 
    [rpm] RPM version 4.1 
    [rpm] Copyright (C) 1998-2002 - Red Hat, Inc. 
    [rpm] This program may be freely redistributed under the terms of the GNU GPL 
    [rpm] 
    [rpm] Usage: rpm [-a|--all] [-f|--file] [-g|--group] [-p|--package] [--specfile] 
    [rpm]   [--whatrequires] [--whatprovides] [-c|--configfiles] [-d|--docfiles] 
    [rpm]   [--dump] [-l|--list] [--queryformat=QUERYFORMAT] [-s|--state] 
    [rpm]   [--nomd5] [--nofiles] [--nodeps] [--noscript] [--addsign] 
    [rpm]   [-K|--checksig] [--import] [--resign] [--nodigest] [--nosignature] 
    [rpm]   [--initdb] [--rebuilddb] [--allfiles] [--allmatches] [--badreloc] 
    [rpm]   [-e|--erase <package>+] [--excludedocs] [--excludepath=<path>] 
    [rpm]   [--force] [-F|--freshen <packagefile>+] [-h|--hash] [--ignorearch] 
    [rpm]   [--ignoreos] [--ignoresize] [-i|--install] [--justdb] [--nodeps] 
    [rpm]   [--nomd5] [--noorder] [--nosuggest] [--noscripts] [--notriggers] 
    [rpm]   [--oldpackage] [--percent] [--prefix=<dir>] [--relocate=<old>=<new>] 
    [rpm]   [--repackage] [--replacefiles] [--replacepkgs] [--test] 
    [rpm]   [-U|--upgrade <packagefile>+] [-D|--define 'MACRO EXPR'] 
    [rpm]   [-E|--eval 'EXPR'] [--macros=<FILE:...>] [--nodigest] [--nosignature] 
    [rpm]   [--rcfile=<FILE:...>] [-r|--root ROOT] [--querytags] [--showrc] 
    [rpm]   [--quiet] [-v|--verbose] [--version] [-?|--help] [--usage] 
    [rpm]   [--scripts] [--setperms] [--setugids] [--conflicts] [--obsoletes] 
    [rpm]   [--provides] [--requires] [--info] [--changelog] [--triggers] 
    [rpm]   [--last] [--filesbypkg] [--redhatprovides] [--redhatrequires] 
    [rpm]   [--buildpolicy=<policy>] [--with=<option>] [--without=<option>] 

all: 

BUILD SUCCESSFUL 
Total time: 1 second 

回答

0

,如果你想看到什么是蚂蚁运行情况发生,你应该了解你感兴趣的任务的来源不知道你有什么蚂蚁版本,但最近的源代码可以在这里看到:http://svn.apache.org/viewvc/ant/core/trunk/src/main/org/apache/tools/ant/taskdefs/optional/Rpm.java?view=markup

的兴趣的方法似乎是:

/** 
* Checks whether <code>rpmbuild</code> is on the PATH and returns 
* the absolute path to it - falls back to <code>rpm</code> 
* otherwise. 
* 
* @return the command used to build RPM's 
* 
* @since 1.6 
*/ 
protected String guessRpmBuildCommand() { 
    Map/*<String, String>*/ env = Execute.getEnvironmentVariables(); 
    String path = (String) env.get(PATH1); 
    if (path == null) { 
     path = (String) env.get(PATH2); 
     if (path == null) { 
      path = (String) env.get(PATH3); 
     } 
    } 

    if (path != null) { 
     Path p = new Path(getProject(), path); 
     String[] pElements = p.list(); 
     for (int i = 0; i < pElements.length; i++) { 
      File f = new File(pElements[i], 
           "rpmbuild" 
           + (Os.isFamily("dos") ? ".exe" : "")); 
      if (f.canRead()) { 
       return f.getAbsolutePath(); 
      } 
     } 
    } 

    return "rpm"; 
} 

的下文称常数是:

private static final String PATH1 = "PATH"; 
private static final String PATH2 = "Path"; 
private static final String PATH3 = "path"; 

就像你提到的,它基本上只是试图找到自己的路径上rpmbuild。如果找不到它,则用于rpm

事情是,我没有安装cygwin(因为我是一个Linux用户),但让我建议,我想试试。

  1. 尝试与-verbose选项运行ant(如下建议:http://ant.apache.org/problems.html),看看它会告诉你一些有用的东西
  2. 如果没有,请尝试下载蚂蚁源(您使用的版本),将其导入你最喜欢的Java IDE,并做远程调试,看看发生了什么。我会把断点放在333行左右,看看是否找到了rpmbuild。如果你不知道如何为蚂蚁设置远程调试,请参见:http://www.vitorrodrigues.com/blog/2009/07/10/debugging-ant-tasks-in-eclipse/

我不知道可执行文件怎么看在Cygwin中,但问题是,如果他们有.exe扩展。另一个重要问题是如果Os.isFamily("dos")将在cygwin中被评估为true。

玩得开心:)