我知道如何从.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文件
答案 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