如何使用java中的源jar创建一个带有已编译类的jar

时间:2014-08-14 21:09:24

标签: java jar compilation javac .class-file

我知道如何从.java或.class文件创建一个jar。

我的sources.jar包含.java个文件。我想编译这些类并再次打包成jar

例如: 这是我想要编译的jar:

hadoop-mapreduce-examples-2.2.0-test-sources.jar

我做jar xvf hadoop-mapreduce-examples-2.2.0-test-sources.jar来提取所有内容。

我现在有

    ls
    META-INF    org

    ls org/apache/hadoop/
examples    mapreduce

    ls org/apache/hadoop/examples/
TestBaileyBorweinPlouffe.java   TestWordStats.java      pi              terasort

正如您所注意到的,我在org.apache.hadoop,“examples和mapreduce”中有两个包,这两个包都必须编译。我在“示例”中有子包,需要编译。

javac org/apache/hadoop/mapreduce/lib/db/TestDBJob.java

这编译好

但是如何递归编译呢?我尝试使用通配符'*'。

这就是我的尝试:

javac -cp org/apache/hadoop/examples/*
javac: invalid flag: org/apache/hadoop/examples/pi
Usage: javac <options> <source files>
use -help for a list of possible options
javac org/apache/hadoop/examples/*.*

在上面执行的最后一个javac中,我没有看到正在编译的子包。只编译了顶级java文件。

是否有简单的解决方案,例如

javac -jar <input.jar> <output.jar>将导致<output-jar>已编译文件。

修改

重复我的问题:

给出一个只有.java个文件的jar,我想要一个以最简单的方式拥有.class个文件的jar文件

2 个答案:

答案 0 :(得分:0)

从DOS控制台

.class文件的cd / dir /文件夹。

jar cvf name.jar

答案 1 :(得分:0)

这是我写的一个非常脏的脚本,用于从源JAR中构建编译的JAR。它可能无法满足所有要求,甚至无法处理清单文件:

#!/bin/bash

if [ "$#" -lt 1 ]; then
    echo "Usage: $0 sources.jar [classpath]"
    echo
    exit 1
fi

OUT_JAR=`basename $1-compiled.jar`

rm -rf $OUT_JAR
rm -rf src
rm -rf classes

mkdir src
mkdir classes

if [ -n "$2" ]; then
  CLASSPATH="-cp $2"
fi

unzip -d src $1
if [ $? -ne 0 ]; then
  echo "Unzip failed"
  exit 1
fi

find src -name *.java | xargs javac -d classes $CLASSPATH
if [ $? -ne 0 ]; then
  echo "Java compilation failed"
  exit 1
fi

jar cf $OUT_JAR -C classes .

if [ $? -ne 0 ]; then
  echo "Jar creation failed"
  exit 1
fi

echo
echo "Compiled and built $OUT_JAR"

也在此处可用:https://github.com/satur9nine/sources-jar-compiler/blob/master/compile-sources-jar.sh