开式蓄冷罐与闭式蓄冷罐_一罐来统治所有人

开式蓄冷罐与闭式蓄冷罐

跳下内存通道

早在1998年,当我是一名C / C ++开发人员时,尝试使用Java时,有关该语言的一些内容对我来说就显得有些恼火了。 我记得很担心这些

  1. 为什么没有合适的编辑器呢? C / C ++有很多。 我为Java拥有的只是旧的记事本。
  2. 当我只需要一个函数时,为什么要上一堂课? 为什么函数也不是对象?
  3. 为什么我不能将所有内容打包到一个zip / jar中,然后让最终用户双击启动?

和其他一些。 那时,我发现自己经常因为无法放弃自己的“ C / C ++思维方式”和拥抱“ Java方式”而自欺欺人。 现在,大约在十年半后的2013年写这篇文章,令人惊讶的是,所有这些早期烦恼都消失了。 不是因为我采用了“ Java”方式,而是因为Java发生了变化。

除了闲聊之外,本文的重点是讨论以下问题之一:“为什么我不能将所有内容打包到一个zip / jar中,让最终用户双击启动?”。

为什么我们需要一个可执行的zip / jar文件?

如果您是一名开发人员,请在您的IDE上愉快地编码(我鄙视所有从一开始就在Eclipse上编码过Java,NetBeans且不必在记事本上编码的人),并在Google的帮助下(我非常讨厌所有人) (他们不必在Google之前就可以在互联网上找到东西),可能没有令人信服的案例。

但是,当您遇到一种情况时

  1. 您之所以进入数据中心,是因为那里的人遵循了您的部署步骤,但是您的应用程序/网站根本无法正常工作?
  2. 突然之间,当“根本没有人碰到”生产箱时,环境变量全部搞砸了,而您就是必须“使其正常工作”的人。
  3. 您正与业务利益相关者坐在一起,难以置信地盯着“ ClassNotFound异常”,并确信Java根本不喜欢您。

简而言之,我想说的是,当您处于开发箱/环境的“相对”理智状态时,一个可执行的jar并不会真正为您做任何事情。 但是,当您进入未知服务器和情况的黄昏区域(没有IDE和其他工具的情况)时,您就会开始意识到单个可执行jar可以提供多少帮助。

不是吗

我天真地这么想,并以艰难的方式找到了答案。 让我来引导您。 激发您的编辑人员。 让我们创建一个可执行的Jar项目。 我使用jdk1.7.0,STS,Maven 3.0.4。 如果您是Maven的新手或刚开始使用,我建议您阅读
这个和这个 。

档案:C:\ projects \ MavenCommands.bat

ECHO OFF
REM =============================
REM Set the env. variables.
REM =============================
SET PATH=%PATH%;C:\ProgramFiles\apache-maven-3.0.4\bin;
SET JAVA_HOME=C:\ProgramFiles\Java\jdk1.7.0
REM =============================
REM Standalone java application.
REM =============================
call mvn archetype:generate ^
-DarchetypeArtifactId=maven-archetype-quickstart ^
-DinteractiveMode=false ^
-DgroupId=foo.bar ^
-DartifactId=executableJar001
pause

运行此批处理文件后,您将拥有一个完全可编译的标准Java应用程序。 继续编译它并构建一个jar(mvn -e clean install)。 您将在C:\ projects \ executableJar001 \ target下得到一个可执行文件Jar001-1.0-SNAPSHOT.jar。 现在放手
java -jar jarFileName '。 在这里,您第一次跌倒。 在令人讨厌的词汇表中,它告诉您不存在带有main方法的类,因此它不知道该执行什么。 幸运的是,这很容易。 有标准的Java程序可以解决它。 并且有一个Maven插件可以解决它。 我将使用后者。

更新的文件:/executableJar001/pom.xml

...<dependencies>...</dependencies><build><plugins><!-- Set main class in the jar. --><plugin><groupid>org.apache.maven.plugins</groupid><artifactid>maven-jar-plugin</artifactid><version>2.4</version><configuration><archive><manifest><mainclass>foo.bar.App</mainclass></manifest></archive></configuration></plugin></plugins></build>...

您可以再次编译和组装应用程序(mvn -e clean install)。 它会在目标文件夹中创建一个jar文件。 尝试再次从命令行运行jar 。 这次您将获得预期的结果。 所以,我们都被排序了,对吧? 错误。 错了

一切似乎都很好。

让我们深入研究一下,我们将发现为什么现在的一切都没有看起来那么好。 让我们继续添加一个依赖,例如,假设我们要添加日志记录,为此我们要使用第三方jar,即logback。 我将让Maven处理开发环境中的依赖项。

更新的文件:/executableJar001/pom.xml

...<dependencies><!-- Logging --><dependency><groupid>ch.qos.logback</groupid><artifactid>logback-classic</artifactid><version>1.0.9</version></dependency></dependencies><build>... </build>

更新的文件:/executableJar001/src/main/java/foo/bar/App.java

package foo.bar;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class App 
{private final static Logger logger = LoggerFactory.getLogger(App.class);public static void main( String[] args ){System.out.println( 'Hello World!' );logger.debug('Hello world from logger.');}
}

现在,让我们使用jar命令从命令提示符处编译并运行jar。 你看到发生了什么事吗?

Exception in thread 'main' java.lang.NoClassDefFoundError: org/slf4j/LoggerFactory

基本上是说找不到LoggerFactory的类(即实际代码)(即我们在开发环境中添加的第3方jar)。

哦,但是可以肯定的是,我们应该能够告诉Java从某个文件夹中提取第三方库。

绝对是 几乎可以肯定的(如果您要问这个问题),对于大多数应用程序,您都告诉JVM第三方/依赖库在哪里。 您可以通过设置classpath来告知。 您可能正在使用某些应用程序服务器,例如Tomcat / Jetty,而这本身可能是一些依赖项。 而这正是问题的根源。

作为开发人员,我提供了一个有效的x.jar。 但是,要使其正常工作,它取决于a.jar(这反过来可能取决于b.jar和c.jar……您明白了)。 当我作为开发人员将我的可交付成果x.jar捆绑在一起时,存在依赖关系-取决于我将其分发给谁-确保在应该使用x.jar的其他环境中正确设置类路径上班。

大多数情况下这没什么大不了的。 但是,这也不是不重要的。 有多种方法可以弄乱对目标环境的依赖性。 可能会有例行更新。 在同一生产环境中可能还部署了其他一些应用程序,需要在jar上进行更新,没人认为会影响您的jar。 我们可以讨论和辩论多种方法来阻止此类不幸事件,但是最重要的是x.jar(开发人员责任)具有依赖性(开发人员不直接控制)。 这会导致不幸。

当然,如果将由于不同版本,不同应用服务器等导致的全部变量添加到此混合中,那么仅提供x.jar的现有解决方案很快就会显得非常脆弱。

那么我们该怎么办?

对P. Simon Tuffs博士表示感谢。 这位先生在此环节解释了他如何迎合这个问题。 这是一本好书,我推荐。 我用非常普通的话解释过的(几乎没有刮过表面),Simon深入探讨了该问题及其解决方法。 长话短说, 他编写了一个解决方案并将其开源 。 我不会再次重放相同的信息-阅读他的文章 ,内容非常丰富-但我会指出他解决方案的重点。

  1. 它使人们可以创建一个包含所有内容(包括代码,资源,依赖项,应用程序服务器(可能))的jar。
  2. 它允许最终用户通过简单的java -jar jarFileName命令来运行整个庞大的jar。
  3. 它允许开发人员以与开发相同的方式进行开发,例如,如果它是Web应用程序,则war文件结构保持不变。 因此,在开发过程中没有任何变化。

那么我们如何去做呢?

在很多地方都有详细的说明。 One-JAR网站 。 与One-JAR的蚂蚁 。 具有一罐的Maven 。

让我们看看它在我们的伪代码上的作用。 值得庆幸的是,还有一个Maven插件 。 遗憾的是,它不在Maven Central存储库中(为什么?伙计们为什么?您投入了98%的工作。为什么对最后2%的工作比较迟钝?)。 它带有不错的
使用说明 。

更新文件:/executableJar001/pom.xml

...<dependencies>... </dependencies><build><plugins>...<!-- If you wanted to bundle all this in one jar. --><plugin><groupid>org.dstovall</groupid><artifactid>onejar-maven-plugin</artifactid><version>1.4.4</version><executions><execution><goals><goal>one-jar</goal></goals></execution></executions></plugin></plugins></build><!-- Required only if you are usng onejar plugin. --><pluginrepositories><pluginrepository><id>onejar-maven-plugin.googlecode.com</id><url>http://onejar-maven-plugin.googlecode.com/svn/mavenrepo</url></pluginrepository></pluginrepositories>

现在,您只需运行mvn -e clean package。 除了普通的广口瓶外,您还将获得一个脂肪充足的自足瓶。 继续,再次从命令提示符处执行java -jar jarFileName。 它应该工作。

嗯..听起来不错。 为什么每个人都没有这样做? 而且这个One-JAR似乎是从2004年开始出现的。为什么我们在这个市场上看不到更多参与者?

你知道他们说免费午餐吗? 没有了。 尽管这个概念非常简洁实用,但这并不意味着其他所有参与者都决定加入。因此,如果您的网站“需要”托管在大型付费应用程序服务器之一上(我不知道为什么您希望继续为那些了解它们的专有软件和技术人员付费。如果您不只是为高素质的技术人员付费,而是依赖那些不会让您陷入困境的开源应用程序,那么One-JAR可能对您来说不是可行的解决方案。 另外,我听到关于事情可能会变慢的不肯定的抱怨(如果您的应用很大,则在加载过程中。因此,在决定使用此方法之前,我建议您进行一次POC并确保您的技术堆栈中没有其他内容对One-JAR不满意。

我个人认为,2004年对于这种事情可能还为时过早。 人们仍在为构建和发布过程的标准化,在ORM领域获得明确的参与者,为MVC框架寻求明确的参与者等而苦苦挣扎。这些问题尚未得到答案,或者很快就会出现。 但是我认为,IT世界当前存在各种问题

  1. 如何使DevOps工作。
  2. 如何使整个构建和发布自动化。
  3. 如何利用开放源代码库提供可靠的软件,同时确保不存在导致锁定的繁重专有软件,从而使解决方案的敏捷性降低,以适应未来的业务需求。

在我看来,One-JAR在该地区表现非常出色。 因此,我绝对希望看到更多有关此工具的工具和/或围绕此概念的更多工具。 而且,公平地说,该领域有更多参与者。 感谢Christian Schlichtherle指出这一点。 有Maven组件插件和Maven阴影插件可以解决这个完全相同的问题。 我还没有尝试过它们,但是从文档上看,它们很不错,功能很明智。 Dropwizard ,虽然不是同一回事,但本质上非常相似。 他们通过嵌入式应用服务器扩展了整个jar的概念,对REST,JSON,Logback的开箱即用支持,以及一个很好的整洁包,您可以直接使用。

因此,正如我一直说的,在技术行业中,这是一段激动人心的时刻,尤其是如果您喜欢修补软件。

参考: Tech Jar for Enterprise博客上的Jjar合作伙伴 Partho 对其进行统治 。

翻译自: https://www.javacodegeeks.com/2013/01/one-jar-to-rule-them-all.html

开式蓄冷罐与闭式蓄冷罐

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350017.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

嵊州D5T2 折纸 folding

折纸 folding 【问题描述】 在非常紧张的 NOIP 考试中&#xff0c;有人喜欢啃指甲&#xff0c;有人喜欢转铅笔&#xff0c;有人喜欢撕 纸条&#xff0c;……而小 x 喜欢迷折纸。 现有一个 W * H 的矩形纸张&#xff0c;监考老师想知道&#xff0c;小 x 至少要折多少次才能使 矩…

使用Portworx和Couchbase的有状态容器

容器本应是短暂的&#xff0c;因此可以很好地扩展以用于无状态应用程序。 有状态的容器&#xff08;例如Couchbase&#xff09;需要区别对待。 管理Docker容器的持久性概述了如何管理有状态容器的持久性。 该博客将说明如何使用Docker Volume Plugins和Portworx创建有状态的容…

java和jvm_java 和 JVM

C和Java的区别指针&#xff1a;java中不存在指针的概念&#xff0c;编程者无法直接通过指针来直接访问内存&#xff0c;有利于维护java程序的安全多重继承&#xff1a;C支持多重继承&#xff0c;java不支持多重继承&#xff0c;但是允许一个类继承多个接口来实现多重继承的问题…

Redis 集群_主从复制_哨兵模型

1 redis集群简介 1.1 集群的概念 所谓的集群&#xff0c;就是通过添加服务器的数量&#xff0c;提供相同的服务&#xff0c;从而让服务器达到一个稳定、高效的状态。 1.1.1 使用redis集群的必要性 问题&#xff1a;我们已经部署好了redis&#xff0c;并且能启动一个redis&#…

java 7 update 17_Java version 7, Update 17 is NOT recongnized by FireFox version 19.0.2

选择的解决方案Reply to my own post:Out of all the solutions posted regarding Java install problems, I gleaned one thing: A re-install of Java and a re-install of Firefox may well solve the problem.Well, for me, thus far, it has.The simple steps I followed:…

英语中的国籍,国家和地区

英语中对于国籍&#xff0c;国家的表述是不一样的&#xff0c;我时常迷糊于此。前些日子我发现了一本英语奇书《Practical English Usage》&#xff0c;这本书回答了我许多英语中的疑问。下面的内容也就是将该书的第364条抄一下。 1&#xff0c;Introduction In order to refer…

junit测试方法_JUnit测试方法订购

junit测试方法直到版本4.10为止的Junit都使用反射API返回的测试类中测试方法的顺序作为测试方法执行的顺序– Class.getMethods&#xff08;&#xff09; 。 引用getMethods&#xff08;&#xff09;api的Javadoc&#xff1a; 返回的数组中的元素未排序&#xff0c;并且没有任…

java非阻塞锁_Java并发问题的非阻塞解决方案

转自http://blog.csdn.net/u011277203/article/details/9223545在并发环境中&#xff0c;对于共享资源通常会采用显式的锁机制(比如synchronized或ReentrantLock)来保证在任意时刻只会有一条线程访问这些变量&#xff0c;并且这些变量的修改对随后获取锁的线程是可见的。无法获…

Java垃圾收集器:G1GC何时将CMS强制退出?

在针对JDK 9&#xff08;2017/4/4&#xff09;提出的JEP中 &#xff0c; Mark Reinhold写道JEP 291 &#xff08;“弃用并发标记扫描&#xff08;CMS&#xff09;垃圾收集器”&#xff09;是“已被放入“建议的在讨论和审查后&#xff0c;由所有者将其定位为目标”。 如果JEP 2…

模块简介/模块的导入/模块的查找顺序/绝对导入和相对导入/软件开发目录规范...

一.模块的简介 什么是模块: 模块就是一系列功能的结合体 模块的三种来源: 1.内置的 2.第三方的  3.自定义的 模块的四种表现形式: 1.使用python编写的py文件(也就意味着py文件也可以称之为模块:一个py文件也可以称之为一个模块)(***)    2.已被编译为共享库或DLL的C或C扩展…

java dll 乱码_java调用c++ dll出现中文乱码 | 学步园

最近的开发用到了使用java调用本机动态连接库的功能&#xff0c;将文件路径通过java调用C代码对文件进行操作。在调用中如果路径中包含有中文字符就会出现问题&#xff0c;程序运行就会中止。下面用一个小例子&#xff0c;来说明记录下解决的方法。java中传入一个字符串&#x…

每日一问:Android 滑动冲突,你们都是怎样处理的

坚持原创日更&#xff0c;短平快的 Android 进阶系列&#xff0c;敬请直接在微信公众号搜索&#xff1a;nanchen&#xff0c;直接关注并设为星标&#xff0c;精彩不容错过。 在 Android 开发中&#xff0c;滑动冲突总是我们一个无法避免的话题。而对于解决方案却是众说纷纭。比…

java多线程 cpu分配_java多线程总结(转载)

Java 多线程编程总结-------------------------------------------------------------------------------------------------下面的内容是很早之前写的&#xff0c;内容不够充实&#xff0c;而且是基于Java1.4的内容&#xff0c;Java5之后&#xff0c;线程并发部分扩展了相当多…

java设计模式迭代器模式_迭代器模式和Java

java设计模式迭代器模式大家好&#xff0c;在本文中&#xff0c;我们将检查Iterator Pattern 。 我知道你们中许多人已经使用过一种设计模式&#xff0c;但是也许您没有意识到它是模式&#xff0c;或者不知道它的巨大价值。 根据《 Head First Design 》一书&#xff1a; 迭代…

笔记_SQLite入门

1、SQLite是什么&#xff1f; QLite没有单独的服务器进程。 它直接读取和写入普通磁盘文件。 具有多个表&#xff0c;索引&#xff0c;触发器和视图的完整SQL数据库包含在单个磁盘文件中。2、SQLite语法 区分大小写&#xff1a; SQLite不区分大小写。但是&#xff0c;有一些区分…

java线程提交_从Java线程到线程池

线程模型线程模型分为两类&#xff0c;用户级线程(ULT)和内核级线程(KLT)用户级线程(ULT)&#xff1a;user level threads&#xff0c;系统内核对ULT无感知&#xff0c;线程的创建和调度都由用户级APP进程管理&#xff1b;即APP自行管理的线程&#xff0c;就是用户级线程内核级…

使用Spring Boot自动发布和监视API

如果您正在沿着微服务风格的架构前进&#xff0c;那么您将需要接受的一个租户就是自动化。 这种架构风格介绍了许多活动部件。 如果成功&#xff0c;您的环境将具有大量服务API&#xff0c;企业可以将其用于应用程序开发和集成。 这意味着必须有一种方法可以发现可用的API文档…

mysql导入导出

导出1.将数据库mydb导出到e:\mysql\mydb.sql文件中&#xff1a;打开开始->运行->输入cmd 进入命令行模式c:\>mysqldump -h localhost -u root -p mydb >e:\mysql\mydb.sql然后输入密码&#xff0c;等待一会导出就成功了&#xff0c;可以到目标文件中检查是否成功。…

mysql 半同步关闭_MySQL的半同步模式配置

1、什么是半同步&#xff1f;在有一台主服务器、多台从服务器的情况下&#xff0c;主服务器只会等待一台从服务器同步数据。2、为什么要使用半同步&#xff1f;在使用同步模式时&#xff0c;数据的写速度太慢。在使用异步模式时&#xff0c;可能会造成从服务器上的现在存储的数…

GIS集成技术之二:数据集成

一。数据驱动。疑惑&#xff1a;ado.net作为一种通用的数据技术&#xff0c;适用与各种格式的文件各种格式的数据库&#xff0c;为一种通用的编程模型。GIS也提出数据集成&#xff1a;毫无疑问&#xff0c;不陷于某击中数据库。因此&#xff0c;我觉得GIS的中心是数据驱动&…