【问题标题】:Java why is my jar file so big?Java为什么我的jar文件这么大?
【发布时间】:2022-03-03 11:28:03
【问题描述】:

我有一个非常简单(而且很短)的程序,编译后大小为 26.9 MB?

我使用了在线 java 反编译器,结果如下:

我的程序使用了一个 java 文件,它是 main.java:

}

为什么我的程序这么大?

【问题讨论】:

  • 这是您的 jar(由您创建)还是某个第三方 jar?
  • 你是如何构建你的 jar 的?
  • 这个 JAR 很可能包含一些依赖库。除了“你的简单程序”
  • 如果你将 Selenium 和 PhantomJs 打包到你的 jar 中,它们是相当依赖的。它们很容易为您提供 26.9 MB
  • org.openqa.selenium 回答了所有问题。 Selenium 库有很多依赖项。 IntelliJ 只是为您自动添加它。

标签: java


【解决方案1】:

如上所述,IntelliJ 会将依赖项打包到创建的 JAR 文件中。您可以通过提取 JAR jar xf file.jar 文件并查看内容来看到这一点。

您可以做的是(按照建议)使用 Maven (https://maven.apache.org/install.html),这将允许您创建依赖项,然后您可以将其提供给类路径上的代码。

使用 IntelliJ 单击文件 > 新建 > 项目,

从列表中选择 Maven 并选择一个项目 SDK。

接下来给你的项目一个 Group ID (com.company) 和 Artifact ID (myproject);暂时保留版本。

现在,给您的项目一个本地名称(这将是在您的 IdeaProjects 目录中创建的文件夹。

IntelliJ 会弹出一条消息给你说“Maven 项目需要导入”,我总是启用自动导入,然后只维护pom.xml 文件。

这将为您创建一个项目,找到您的 pom.xml 文件:它看起来像:

<?xml version="1.0" encoding="UTF-8"?>
<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.company</groupId>
    <artifactId>myproject</artifactId>
    <version>1.0-SNAPSHOT</version>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.5.1</version>
                <configuration>
                    <source>1.7</source>
                    <target>1.7</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-firefox-driver</artifactId>
            <version>2.53.1</version><!-- Pick a different version if needed -->
        </dependency> 
    </dependencies>
</project>

现在您可以通过在终端运行mvn package 来打包您的项目,您的jar 文件将保存到target 目录中。它会非常小,因为它只包含您的代码。

要运行程序,您可以执行以下操作:

mvn exec:java -Dexec.mainClass="com.company.Test" -Dexec.args="space separated arguments"

【讨论】:

    【解决方案2】:

    您的代码中似乎使用了很多外部库(现在当您提供代码时,它们似乎是由 Selenium 提取的),intellij 将它们一起打包到一个 jar 中,因此您无需运行程序即可在运行时关心类路径。

    为了减小 jar 的大小,我可以建议以下方法:

    1. 减少外部库(导入的类)的数量。例如,不要包含 java.io.*,而只包含您实际使用的类。

    2. 使用 ant 或 maven 构建正确的编译脚本。然后你的 jar 将只包含你的类,并且相对于你现在拥有的来说非常小。但是,要运行您的代码,您需要注意在运行时拥有所有必需的库。

    【讨论】:

    • 他的代码中没有这样的org.apache.commons.*
    • 我不知道你在这段代码中到底有什么,因为你没有从一开始就提供它。但仔细阅读,这就是例子!当你只需要一个类时,不要包含完整的命名空间。
    • 问题中提供了代码。仔细阅读。而且它不是我的。
    • 不是从一开始。
    • 任何想在这里发布答案的人都应该准备好接受对所提供答案的批评。如果你不能处理它,你不应该回答。这就是为什么我们用一个解释来反对投票,这样人们就会知道哪里出了问题并解决它,然后反对票可能会像我一样被撤回。接受了道歉。只是下次不要把它当作私人的。 :)
    猜你喜欢
    • 2010-10-06
    • 2020-04-05
    • 1970-01-01
    • 2013-05-15
    • 2023-03-10
    • 2012-06-14
    • 1970-01-01
    • 2010-11-09
    • 2016-11-12
    相关资源
    最近更新 更多