如何从超级罐子获得子图库清单

时间:2015-12-22 20:49:41

标签: java maven jar pom.xml

我正在构建一个超级jar,我试图提取子库清单文件的版本信息。出于某种原因,清单信息不再出现在jar中。

这曾经是一个使用war插件构建的项目,但是,我无法弄清楚如何使用jar插件获得相同的行为。

这是我目前的配置。我不确定为什么它不再起作用。

如何将图书馆清单信息拉出来或发生什么事情使这不起作用?

可执行的pom文件

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <id>package-jar-with-dependencies</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                    <configuration>
                        <appendAssemblyId>false</appendAssemblyId>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <archive>
                            <manifest>
                                <mainClass>com.clearwateranalytics.perseus.worker.PerseusWorker</mainClass>
                                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
                                <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
                            </manifest>
                            <manifestEntries>
                                <Implementation-Build>${build.number}</Implementation-Build>
                                <Build-Date>${maven.build.timestamp}</Build-Date>
                            </manifestEntries>
                        </archive>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

图书馆pom

<build>
    <resources>
        <resource>
            <directory>${project.basedir}/src/main/java</directory>
            <includes>
                <include>**/*.properties</include>
            </includes>
        </resource>
    </resources>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <configuration>
                <archive>
                    <manifestEntries>
                        <Implementation-Build>${build.number}</Implementation-Build>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

获取构建信息的库方法

private static String getBuildNumber()
{
    try
    {
        Enumeration<URL> resources = ServerVersionDao.class.getClassLoader().getResources("META-INF/MANIFEST.MF");
        while (resources.hasMoreElements())
        {
            try
            {
                Manifest manifest = new Manifest(resources.nextElement().openStream());
                Attributes attributes = manifest.getMainAttributes();
                if ("perseus-server-lib".equals(attributes.getValue("Implementation-Title")))
                {
                    String versionNumber = getVersion(ServerVersionDao.class);
                    String buildNumber = attributes.getValue("Implementation-Build");
                    String build = "";
                    if (versionNumber != null)
                        build += versionNumber;
                    if (buildNumber != null)
                        build += " b" + buildNumber;

                    if (!build.trim().isEmpty())
                        return build;
                }
            }
            catch (IOException ex)
            {
            }
        }
    }
    catch (Exception ex)
    {
    }
    throw new IllegalStateException("Got here!!!!");
}

1 个答案:

答案 0 :(得分:0)

您好我不认为您可以按预期添加单个MANIFEST。这些类只包含在uber-jar中,而不是作为jar,而是作为包。

但是如果你想要检索作为依赖项之一的特定库的版本(对吗?),你最终可以遵循与上面的代码类似的模式,而不是尝试加载生成的META-INF / MANIFEST,您可以找到所包含的依赖项的版本信息,附近;)

META-INF\maven\perseus/perseus-serverlib\pom.properties

e.g

#Generated by Maven
#Sun Aug 02 13:18:09 PDT 2015
version=1.8.3
groupId=org.jsoup
artifactId=jsoup

试一试:)

在那里你可以找到如下的属性文件:

<div class="container">
    <div class="row">
       <nav class="navbar navbar-default  navbar-lower" role="navigation">
            <div class="container">
                <div class="container collapse navbar-collapse">
                    <ul class="nav navbar-nav pull-right">
                        <li><a href="#">Link</a></li>
                        <li><a href="#">Link</a></li>
                        <li><a href="#">Link</a></li>

                    </ul>

                </div>
            </div>
        </nav>
    </div>
</div>