我注意到给我的.class
文件(在构建服务器上使用Ant javac
编译)和使用Maven(本地)之间的文件大小存在差异。我查看了类文件的内容并看到了差异,我有兴趣了解这些差异的来源。
给我:
public class TableData
{
public static String[] getTableNames()
{
ArrayList localArrayList = new ArrayList(TableData.Table.values().length);
for (TableData.Table localTable : TableData.Table.values()) {
localArrayList.add(localTable.getName());
}
return (String[])localArrayList.toArray(new String[localArrayList.size()]);
}
本地版本:
public class TableData
{
public static String[] getTableNames()
{
List<String> tableNames = new ArrayList(TableData.Table.values().length);
for (TableData.Table table : TableData.Table.values()) {
tableNames.add(table.getName());
}
return (String[])tableNames.toArray(new String[tableNames.size()]);
}
给我:1371字节
本地版本:1819字节
javap
很多相似之处,例如:
InnerClasses:
public static final #17= #16 of #14; //Table=class (et cetera)
minor version: 0
major version: 51
flags: ACC_PUBLIC, ACC_SUPER
给我:
#23 = Utf8 Code
#24 = Utf8 LineNumberTable
#25 = Utf8 getTableNames
#26 = Utf8 ()[Ljava/lang/String;
本地版本:
#23 = Utf8 Code
#24 = Utf8 LineNumberTable
#25 = Utf8 LocalVariableTable
#26 = Utf8 this
#27 = Utf8 L.../TableData;
#28 = Utf8 getTableNames
#29 = Utf8 ()[Ljava/lang/String;
给我:
<javac target="1.7" source="1.7" srcdir="${src.dir}"
excludes="..." destdir="..." classpathref="app.classpath"
verbose="${compile.verbose}" debug="${compile.debug}"
debuglevel="${compile.debuglevel}" includeAntRuntime="true" />
compile.debug: on
compile.debugLevel: lines,source
本地版本:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
问题:为什么?
答案 0 :(得分:1)
从Maven编译器插件的文档:
debug
boolean
设置为true以在已编译的类文件中包含调试信息 默认值为:true。
更改此配置属性会删除文件大小的差异:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<debug>false</debug>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>