【问题标题】:jar finding main class on my computer, but not finding on someone else'sjar 在我的电脑上找到主要课程,但在别人的电脑上找不到
【发布时间】:2020-10-24 12:38:55
【问题描述】:

我的程序的 jar 用 maven 打包。我设置了清单文件以了解我的主类在哪里。它在我的机器上执行没有问题。但是,当我将 jar 给朋友进行 beta 测试时,他们得到了找不到主类的错误。我们正在运行相同版本的 JRE

我的:

他们的:

这是我为此看到的其他堆栈溢出答案中的建议问题。

我已解压缩 jar 以确保清单文件实际上正确设置了主类的位置,并且确实如此。那么这可能是什么问题呢?

编辑:用于构建清单的 pom.xml 的相关部分

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>com.dreadylocks.MyCloset.MyCloset</mainClass>
                        </manifest>
                    </archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
                <executions>
                    <execution>
                        <id>make-assembly</id> <!-- this is used for inheritance merges -->
                        <phase>package</phase> <!-- bind to the packaging phase -->
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

当我解压 jar 时,这些是 META-INF/MANIFEST.MF 的内容

Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: saman
Build-Jdk: 1.8.0_251
Main-Class: com.dreadylocks.MyCloset.MyCloset

项目结构:

【问题讨论】:

  • 我的包是 com.dreadylocks.MyCloset 并且 main 在一个名为 MyCloset 的类(.java 文件)中
  • 我想你的包可能只是 com.dreadylocks。您不会将类名作为包名的一部分。

标签: java manifest executable-jar


【解决方案1】:

您需要在pom.xml 中配置maven-jar-plugin。这个插件负责打包和创建manifest.MF

      <build>
        <plugins>
          <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            ...
            <configuration>
              <archive>
                <manifest>
                  <addClasspath>true</addClasspath>
                  <mainClass>your.package.MainClass</mainClass>
                </manifest>
              </archive>
            </configuration>
            ...
          </plugin>
        </plugins>
      </build>

【讨论】:

  • 我几乎相同,我用 pom.xml 的构建部分的内容和 manifest.MF 的内容编辑了我的 OP。我将尝试添加类路径并查看。
【解决方案2】:

您的 maven-assembly-plugin 配置看起来不错,但 mainClass 包名称看起来很奇怪。通常你不会将你的类名包含在你的包中。

我建议从你的 mainClass 包中删除最后一个“.MyCloset”:

...
<manifest>
    <mainClass>com.dreadylocks.MyCloset</mainClass>
</manifest>
...

也就是说,除非您确实有一个名为 MyCloset 的目录,其中包含您的 MyCloset 类。无论哪种方式,您和您的朋友运行 jar 的位置或方式都可能存在差异。

如果您都使用 java -jar /path/to/jar/myjar.jar 运行,那么您可能是从 com/mydreadylocks/MyCloset 运行 当他们从 com/mydreadylocks 运行时。

【讨论】:

  • 那行不通。 MyCloset 是包名称,但它也是我的主要方法的类的名称。如果我删除第二个 MyCloset,它甚至在我的机器上也无法工作。
  • 您的 MyCloset 是否在名为 MyCloset 的目录中?如果是这样,那是非常非常规的做法。我也会将 MyCloset 移到 dreadylocks 中。请参阅上面的编辑。
  • 我进行了编辑以显示我的项目结构。我知道这是非常规的(我是 java 新手,所以命名包不是我学到的最佳实践),但它真的会导致这个问题吗?
  • 没问题,但如果他们从 com/mydreadylocks 运行而您从 com/mydreadylocks/MyCloset 运行,它可能会解释为什么它适用于您而不是其他人。也许让他们向您发送您在上面发布的屏幕截图,看看是否匹配。
  • 回复关于 jar 位置的编辑:我认为 jar 是独立的。我打包了所有依赖项,这样它就可以通过双击运行,只安装了 jre。我尝试将 jar 移动到我电脑上的一堆不同的目录位置,它们都运行良好。问题出在她身上。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 2022-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-11
相关资源
最近更新 更多