我正在尝试使用Maven和命令行在Java中设置一个hello world示例,并且一切运行良好,除了最终的.jar文件看起来是错误的。
我的项目具有以下结构:
./的pom.xml
./ SRC /主/爪哇/我/项目/路径/示例/ Example.class
我的pom.xml文件如下所示:
<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>my.project.path</groupId>
<artifactId>example</artifactId>
<version>0.1</version>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>jar</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>exec-maven-plugin</artifactId>
<version>1.2.1</version>
<configuration>
<mainClass>my.project.path.example.Example</mainClass>
</configuration>
</plugin>
</plugins>
</build>
</project>
我的最终.jar文件有这样的结构:
./ Example.class
./ META-INF /...
我希望它是:
./我/项目/路径/示例/ Example.class
./ META-INF /...
Java 7和Apache Maven 3.0.4。
我错过了什么吗?
答案 0 :(得分:2)
如果你有明显的问题(找到主类),我个人使用maven编译器插件:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
<archive>
<manifest>
<mainClass>br.usp.lta.Example</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
另外,请确保顶部的结构匹配:
<groupId>my.usp</groupId>
<artifactId>lta</artifactId>
<packaging>jar</packaging>
然后你的主要课程将在src/main/java/my/usp/lta/Example.class
。使用你的pom为我编译好了。
答案 1 :(得分:0)
如果您有依赖项,可以让maven-dependency-plugin
配置主jar以在类路径中引用。这是在主jar的Manifest文件中配置的。
maven-jar-plugin
有助于创建可执行jar
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>prepare-package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>false</overWriteSnapshots>
<overWriteIfNewer>true</overWriteIfNewer>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>com.example.MyMain</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
</plugins>
答案 2 :(得分:0)
您在包名中使用了Java保留字:&#39; class&#39;。那不会编译。 在你的pom文件中,你需要添加maven jar插件。除了你需要的编译器插件。例如:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>2.4</version>
<configuration>
<archive>
<manifest>
<mainClass>my.path.example.Example</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
答案 3 :(得分:0)
我忘了&#34;包&#34;声明位于文件顶部。根据Java语言规范:
7.4.2。未命名的包
没有包声明的编译单元是 未命名的包裹。
未命名的软件包主要由Java SE平台提供 开发小型或临时应用程序时的便利性 刚刚开始发展。
一个未命名的包不能有子包,因为a的语法 包声明始终包含对命名顶级的引用 封装
因此,添加以下行解决了问题:
package my.project.path.example;